View繪製相關知識點

View繪製相關知識點

.
.
.

一.view樹的繪製流程

大體上分爲:measure------>layout------>draw這三個步驟

二.measure方法:

在這裏插入圖片描述
參數1.ViewGroup.layoutParams:這個參數表示了子視圖的大小,一般有三種類型:
match_parent:表示是子視圖想和父控件一樣大(不包括padding值)
warp_content:整個父控件只要能包含這個子控件就行
以及具體的長寬值。

參數2:MeasureSpec: 這個參數表示了測量規格,其實是一個32位的int值。其中最高的兩位代表了測量模式,後面的30位表示了這種測量模式下測量出來的大小。
其中測量模式有三種:
1.不確定的,父控件不會對子控件的大小有任何約束,但不可以超出屏幕的尺寸(幾乎不會用到)
2.exactly:子視圖可以在父容器限制的尺寸範圍內設置大小
3.atmost:父容器給子視圖指定了最大的大小,子視圖的大小必須在這個範圍內。這種模式下父控件無法獲取子控件的大小,只能由子控件自行測量尺寸。
.
.
.

measure方法中比較重要的回調方法

measure()方法:通過上方的MeasureSpec參數獲取到了控件的寬高,再通過onMeasure()方法進行繪製。在onMeasure()方法中又調用了setMeasureDimension()方法,將所有測量到的數據傳入setMeasureDimension()。到此,測量流程結束

在安卓中有一種重新測量機制,當父容器覺得子視圖測量出來的數據不合理,則會再次進行measure過程。如果還是不合理,就會更改測量模式來進行再次測量。

三.Layout方法

layout方法與measure類似,也是樹形地遍歷view樹,調用子控件的layout方法來進行對子控件的位置擺放。
在layout方法中同樣的也調用了onLayou方法。

四.draw方法

在屏幕上繪製控件的方法。
其中有兩個重要的回調方法:

invalidate():向系統發出請求,如果控件的大小沒有變化,則不會調用layout這個過程
**requestLayout()方法:**當試圖發生變化的時候,如大小的變化,方向的變化等就會調用這個方法。在這個方法內部重新進行measure過程和layout過程。但不會調用draw方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章