view樹的繪製流程,其實就是乙個遞迴的過程
過程: measure->layout->draw
①對所有子元素進行測量, 測量過程從父viewgroup傳到view中,測量好了所有的子元素之後,進行遞迴,反覆之後,就完成了父元素viewgroup的測量。
②layout相類似
遍歷過程
根據父容器對子容器的一些測量引數獲取到子容器的長寬高,把子容器測量的長寬高返給父容器進行統一的測量。樹的遍歷過程,從上到下進行遍歷。
重要引數:
1.viewgroup.layoutparams:指定檢視的寬高.
三種值:
①具體值
②match-parent:不包括padding值,子檢視大小和父控制項大小一樣大。
③wrap-content:包括子控制項大小即可。能包含子控制項即可。
2.measurespec:測量規格(32位int值)
高兩位是模式佔位符,表示的是測量模式。
三種模式:
①不確定的(不用的)
②exactly:父容器為子檢視確定乙個大小,無論子檢視需要多大,都必須要在這個範圍內
③at_most:父容器為子檢視規定的最大的尺寸,必須在這個範圍內,父控制項沒有辦法獲取子控制項的尺寸,只能是子控制項根據自己的需求自己去測量自己的尺寸。
容器在布局時呼叫子view的measure方法傳入的模式是exactly,因為子view會佔據剩餘容器的空間,所以它大小是確定的。而當設定為wrap_content時,容器傳進去的是at_most, 表示子view的大小最多是多少,這樣子view會根據這個上限來設定自己的尺寸。當子view的大小設定為精確值時,容器傳入的是exactly, 而measurespec的unspecified模式目前還沒有發現在什麼情況下使用。
後30位表示在這種測量模式下檢視尺寸的大小。
在measure過程中,系統會將這個view的layoutparams結合父容器生成乙個measurespec,measurespec測量規格規定好怎樣測量空間的大小,所有大小都會被包裝成measurespec測量規格,返還給父容器,告訴如何測量控制項的大小。
重要方法
1.measure
final方法,通過measurespec獲得寬高的測量規格,最終呼叫onmeasure方法進行測量,自定義的時候只需要複寫onmeasure方法即可。
public
final
void
measure
(int widthmeasurespec,
int heightmeasurespec)
2.onmeasure:自定義檢視當中,實現測量邏輯的方法。
setmeasureddimension測量階段的終極也就是實現他的方法,測量階段結束的方法,必須被呼叫,否則會報異常。
protected
void
onmeasure
(int widthmeasurespec,
int heightmeasurespec)
總結: measure方法呼叫onmeasure方法,將所有的長寬高傳給setmeasureddimension方法,最後完成測量。通過measurespec約束子檢視的寬高,保證所有父檢視能夠接受子檢視傳遞的測量,如果父檢視覺得子檢視傳遞的長高不對,會再次請求子檢視再次進行測量,進行第二次measure,如果最終的子檢視還是超出了約束,或者是過於小了,那麼父檢視就會給定乙個固定的大小,將其設定為exactly或者at_most再次對子檢視進行測量。
是否需要重新安置試圖位置
自上而下的遍歷過程,layout根據測量所得到的尺寸擺放子檢視的位置(子檢視的具體位置都是相互對於父檢視而言的)。
view的onlayout()是乙個空實現,如果要自定義view的話,繼承viewgroup時,必須要重寫onlayout方法,重新擺放自己自定義view的位置
public
void
layout
(int l,
int t,
int r,
int b)
// 空方法,子類如果是 viewgroup 型別,則重寫這個方法,實現 viewgroup 中所有 view 控制項布局
protected
void
onlayout
(boolean changed,
int left,
int top,
int right,
int bottom)
總結: layout也是乙個樹形的結構,當他需要進行資料擺放的時候,依次從group呼叫view,依次進行擺放。
是否需要重繪
兩個容易混淆的方法:
1.invalidate():請求安卓系統,檢視大小沒有發生變化,不會呼叫layout放置過程。
2.requestlayout():當布局發生變化的時候,自定義檢視的時候經常呼叫(需要重新測量檢視尺寸的大小),呼叫之後它就會觸發measure和layout方法,不會呼叫draw方法。
View繪製及事件分發機制
measure onmeasure layout onlayout draw 1 繪製自己background.draw canvas 2 繪製自己 ondraw 3 繪製children dispatchdraw 4 繪 飾 ondrawscrollbars 主要由3個函式組成 dispatcht...
View 的繪製流程
view的measure 過程由其measure方法完成,measure 方法是乙個final型別的方法,子類不能重寫。在view的mesure方法中會呼叫onmeasure 我們只看onmeasure方法就可了。view原始碼 protected void onmeasure int widthm...
戲說View的繪製流程
android城中的老張今年收成不錯,玉公尺,麥子收了倉溢庫滿 日子過得紅火不說,幾個兒子也比較爭氣,工作沒幾年就都帶了個女朋友回家 沒辦法兒子大了房子住不下了,必須重新的蓋房不是 咱老百姓不就圖個兒孫滿堂嘛,蓋房子立即提上了老兩口的議事日程 老張量了下前年新分的宅基地 2560x1440 為了體現...