天天看點

View和ViewGroup的測量與繪制過程總結

1、View的測量

View在調用onDraw(Canvas)方法繪制自己之前,會先去調用onMeasure(int ,int)方法測量自己。我們可以通過取onMeasure方法傳遞進來的參數的高兩位獲得測量模式,測量的模式有三種:

EXACTLY:即精确值模式,對應于“match_parent”或者明确指出寬高值的情況,在這種測量模式下,取值就從onMeasure方法傳遞進來的參數中得到。系統預設就是此模式。

AT_MOST:即最大值模式,此模式對應的是寬高值為“wrap_content”,控件的大小一般随着内容的大小變化而變化,隻要不超過父控件允許的最大值即可。

UNSPECIFIED:平時很少用到,在自定義View的時候有時會用到。

注意: 自定義View的時候,如果測量模式是AT_MOST時,必須重寫onMeasure方法去重新測量控件的大小。比如,控件裡面有一張背景圖檔,那麼控件的大小應該就是這張圖檔的大小,并把這個值設定成控件的大小。調用 setMeasuredDimension(mWidth, mHeight)去設定。

2、View的繪制

其實View的繪制沒什麼好說的,我們要想讓控件繪制我們自己想要的東西,就重寫onDraw(canvas) 方法。

3、ViewGroup的測量

如果測量模式是AT_MOST,ViewGroup就會去周遊它的所有子View,調用子View的Measure方法去獲得測量值,然後确定自己的測量值。

當VIewGroup測試完成後,就需要确定子View的擺放位置,即回調onLayout()方法,這時ViewGroup同樣會去周遊子View的layout方法,并指定具體位置。是以,如果我們自定義布局的時候,需要重寫onlayout方法去布局子View。

4、ViewGroup的繪制

ViewGroup一般不會繪制自己,除非設定了布局背景顔色。但是ViewGroup會調用dispatchDraw()方法來繪制其子View,同樣是周遊所有子View然後調用它們的繪制方法完成繪制。

注意:控件是先測量大小、再布局位置、再執行繪制。

繼續閱讀