View 的繪製流程

2021-07-13 06:42:21 字數 1717 閱讀 5275

view的measure 過程由其measure方法完成,measure 方法是乙個final型別的方法,子類不能重寫。在view的mesure方法中會呼叫onmeasure 我們只看onmeasure方法就可了。

view原始碼:

protected

void

onmeasure(

int widthmeasurespec,

int heightmeasurespec)

看著很簡單。setmeasureddimension 方法會設定view的寬高測量值,我們只看getdefaultsize 方法即可

public

static

intgetdefaultsize(int size, int measurespec)

return result;

}可以看出getdefaultsize 方法很簡單,我們只看most,exactly就可以簡單的說getdefaultsize方法返回值就是measurespec view測量後寬高。 為什麼要說測量後,view的最終寬高在onlayout階段確定的。所以不許加以區分。但是幾乎所有情況下view的 onmeasure,onlayout中的值是一樣。

至於unspecified,一半用於系統內部測量,寬高就為第乙個引數的值 getsuggestedminimumwidth(), getsuggestedminimumheight(), 簡單分析乙個另個方法類似這裡就不進行分析

protected

intgetsuggestedminimumwidth()

邏輯同樣是很清晰,mbackground ==null 時候 返回mminwidth,而mminwidth 就是android:minwidth屬性值,當然如果不進行設定預設minwidth=0。那麼mbackground指的是drawable.getminimumwidth()

public

intgetminimumwidth()

返回的是drawable的原始寬度,前提是這個drawable有原始寬度。那麼問題來了drawable什麼情況下沒有原始寬度?

shapedrawable沒有原始寬度,而bitmapdrable有原始寬度

在總結一下getsuggestedminimumwidth邏輯。view沒有設定背景怎麼返回minwidth (如果minwidth沒有設定值預設為0),view設定了背景則返回mbackground 和 minwidth中最大的值。

那通過上面可以推出來自定義view需要重寫onmesure 方法。並且 寬高值設定wrap_content 和 match_parent 是一樣的效果

為什麼會出現上面情況

switch (specmode)
設定 wrap_content的模式為at_most:這樣view的寬高為specsize等於parentsize ,很顯然view的寬高就等於父容器剩餘空間的大小。這種和在不居中使用match_parent完全一致如何解決這樣問題。也很簡單。

@override

protected

void

onmeasure(int widthmeasurespec, int heightmeasurespec)

具體寬高預設值給多少根據具體需求。

eg:可以檢視其他系統元件是如何處理 預設寬高值。這裡就不進行分析

戲說View的繪製流程

android城中的老張今年收成不錯,玉公尺,麥子收了倉溢庫滿 日子過得紅火不說,幾個兒子也比較爭氣,工作沒幾年就都帶了個女朋友回家 沒辦法兒子大了房子住不下了,必須重新的蓋房不是 咱老百姓不就圖個兒孫滿堂嘛,蓋房子立即提上了老兩口的議事日程 老張量了下前年新分的宅基地 2560x1440 為了體現...

筆記 view的繪製流程

其中viewgroup decorview 的measure方法中會呼叫到他的onmeasure方法,在這個方法中會呼叫所有子元素的measure方法來對子元素進行測量寬和高,這樣就把測量流程傳遞到子元素中,子元素重複父容器的測量流程,從而把所有view都進行測量 layout和draw流程和mea...

View的繪製機制

view樹的繪製流程,其實就是乙個遞迴的過程 過程 measure layout draw 對所有子元素進行測量,測量過程從父viewgroup傳到view中,測量好了所有的子元素之後,進行遞迴,反覆之後,就完成了父元素viewgroup的測量。layout相類似 遍歷過程 根據父容器對子容器的一些...