hencoder 的第二季:自定義 view 第二部分——布局過程的自定義,從這期正式開始了。好像有點小激動。
廢話少說,直入正題。
會者不難這個詞在很多地方都講得通,但在布局過程的自定義上,尤為適用。
有人說:什麼?簡介完了就是總結了?
布局過程,就是程式在執行時利用布局檔案的**來計算出實際尺寸的過程。
兩個階段:測量階段和布局階段。
測量階段:從上到下遞迴地呼叫每個 view 或者 viewgroup 的 measure() 方法,測量他們的尺寸並計算它們的位置;
布局階段:從上到下遞迴地呼叫每個 view 或者 viewgroup 的 layout() 方法,把測得的它們的尺寸和位置賦值給它們。
測量階段,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 的尺寸。
那就關注一下?↓↓↓
21 綜合應用石頭剪刀布
迴圈 即重複,當某些語句要出現執行多次時,就會把這 些語句放到迴圈的大括號內。迴圈體 是迴圈大括號內的所有語句的集合。迴圈的次數,往往會定義乙個整型變數來控制,叫迴圈變數。迴圈變數的三個必要表示式 1.初值,是賦值語句,如 x 1 2.終限,是關係或關係加邏輯表示式,如 x 100 3.步長,是乙個...
Git 2 1發布 新特性預覽
在git 2.0發布兩個半月之後,git又發布了新的版本2.1版。雖然只是小版本號的更新,但是這一版的新特性和改進的內容的列表卻很長。可以從git倉庫找到完整的發布日誌,該日誌提供了關於git 2.1版更多的細節。下面我們挑選了一些git 2.1版的新特性來進行一下簡單的介紹。新版的git同樣也包含...
Angular 中間部分 2 1 內建指令和表單
基於條件,用於顯示或隱藏乙個元素,true顯示,false隱藏 div never shows div str yes shows根據返回值,切換不同元素 class container ngswitch myvar var is adiv var is bdiv var is something ...