View的繪製機制

2021-09-29 09:20:56 字數 2776 閱讀 6581

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 為了體現...