HenCoder UI 部分 2-1 布局基础
HenCoder 的第二季:自定義 View 第二部分——布局過程的自定義,從這期正式開始了。好像有點小激動。
廢話少說,直入正題。
簡介
之前我說過,自定義 View 最關鍵的有三個點:繪制、布局和觸摸反饋。上一季講過的繪制,內容雖然多(好像講了 8 期?),但難度上其實是最簡單的。而布局就和它相反,布局過程的技術知識,內容比較少(應該 3 期就能講完),但你先要理解它的內部工作原理才能正確理解它的使用,而它的工作原理卻是有點繞的。所以如果你跟著 HenCoder 學習布局過程的自定義,大致會是這樣一種體驗:看完視頻或者讀完文章,感覺吸收了一大波知識,信息量好大難以吞咽的樣子,但當你真的把它們吞咽下去,然后下載了我的練習項目去做練習的時候,卻又發現:臥槽,就這么點東西?布局過程的自定義竟然這么簡單?
會者不難這個詞在很多地方都講得通,但在布局過程的自定義上,尤為適用。
具體的概念、原理和技術細節,來看視頻吧:
總結
有人說:什么?簡介完了就是總結了?
嚯嚯,對的。所有的內容都在視頻里講完了,所以在這里就把視頻里講到的關鍵點總結一下:
布局過程的含義
布局過程,就是程序在運行時利用布局文件的代碼來計算出實際尺寸的過程。
布局過程的工作內容
兩個階段:測量階段和布局階段。
測量階段:從上到下遞歸地調用每個 View 或者 ViewGroup 的 measure() 方法,測量他們的尺寸并計算它們的位置;
布局階段:從上到下遞歸地調用每個 View 或者 ViewGroup 的 layout() 方法,把測得的它們的尺寸和位置賦值給它們。
View 或 ViewGroup 的布局過程
測量階段,measure()?方法被父 View 調用,在?measure()?中做一些準備和優化工作后,調用?onMeasure()?來進行實際的自我測量。?onMeasure()?做的事,View?和?ViewGroup?不一樣:
View:View?在?onMeasure()?中會計算出自己的尺寸然后保存;
ViewGroup:ViewGroup?在?onMeasure()?中會調用所有子 View 的?measure()?讓它們進行自我測量,并根據子 View 計算出的期望尺寸來計算出它們的實際尺寸和位置(實際上 99.99% 的父 View 都會使用子 View 給出的期望尺寸來作為實際尺寸,原因在下期或下下期會講到)然后保存。同時,它也會根據子 View 的尺寸和位置來計算出自己的尺寸然后保存;
布局階段,layout()?方法被父 View 調用,在?layout()?中它會保存父 View 傳進來的自己的位置和尺寸,并且調用?onLayout()?來進行實際的內部布局。onLayout()?做的事,?View?和?ViewGroup也不一樣:
View:由于沒有子 View,所以?View?的?onLayout()?什么也不做。
ViewGroup:ViewGroup?在?onLayout()?中會調用自己的所有子 View 的?layout()?方法,把它們的尺寸和位置傳給它們,讓它們完成自我的內部布局。
布局過程自定義的方式
三類:
重寫?onMeasure()?來修改已有的?View?的尺寸;
重寫?onMeasure()?來全新定制自定義?View?的尺寸;
重寫?onMeasure()?和?onLayout()?來全新定制自定義?ViewGroup?的內部布局。
第一類自定義的具體做法
也就是重寫?onMeasure()?來修改已有的?View?的尺寸的具體做法:
重寫?onMeasure()?方法,并在里面調用?super.onMeasure(),觸發原有的自我測量;
在?super.onMeasure()?的下面用?getMeasuredWidth()?和?getMeasuredHeight()?來獲取到之前的測量結果,并使用自己的算法,根據測量結果計算出新的結果;
調用?setMeasuredDimension()?來保存新的結果。
練習項目
為了避免轉頭就忘,強烈建議你趁熱打鐵,做一下這個練習項目:HenCoderPracticeLayout1(微信用戶可以點底部的「閱讀原文」)
下期預告
下期是布局部分的最后一期:全新自定義 View 的尺寸。
覺得贊?
那就關注一下?↓↓↓
總結
以上是生活随笔為你收集整理的HenCoder UI 部分 2-1 布局基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS学习记录(BOM部分)
- 下一篇: 在linux上安装jdk(转载)