Android中view的繪製流程原理詳解

view的繪製流程

view的繪製流程分爲mesure、layout和draw三個階段,measure是對view寬和高進行測量,確定了view的measuredwidht和measuredheight,layout是對view進行佈局,確定了view四個頂點的位置,draw是將view繪製在屏幕之上。

1、Measure,
View的measure要分爲兩種情況來說:

1.1、非容器 view,它的 measure 過程比較簡單,就是在其 onmeasure方法中根據父view傳遞過來的measurespec和自身的情況來得到其自身的寬和高,然後通過 setmeasureddimension去設置這個寬和高。

1.2、對於viewgroup的 measure過程,viewgroup的測量,不但要在 onmeasure要完成自身的測量,還要完成對它其中的子元素的測量, 因爲,各種 viewgroup的佈局不同,所以測量的細節也不同,因此, viewgroup中沒有具體實現 onmeasure方法,而是讓子類自己去實現。
viewgroup子類實現 onmeasure的一般過程是調用 measurechildren去測量子元素,measurechildren中會遍歷出所有的子元素,然後依次調用 measurechild方法去對每一個 子元素進行測量,在 measurechild中會調用 getchildmeasurespec 通過父容器的 measurespec和子元素的 layoutparams,pading等得 到子元素的 measurespec,然後調用子元素的 measure方法,將剛纔得到的子元素的 measurespec傳遞給子元素的 measure方法,讓子元 素自己去完成自身的測量,這樣就將測量的過程從父容器傳遞到子元素中去了,當所有子元素測量完畢之後,父容器還要根據子元素的測量情況, 來測量自身的大小。例如LinearLayout的測量過程中就會維護一個totallength的變量,每測量一個子元素,totallength就會加上這個子元素的高度或者寬度,最後LinearLayout會根據這個變量通過setmeasureddimension去設置自己的寬高。

2、Layout
view的layout過程也分爲兩種情況:

2.1、非容器view的,它的layout過程也比較簡單,就是在其layout方法中根據父view傳遞過來的四個頂點的位置結合自身情況來得到自身四個頂點的位置,然後調用setframe對這個四個頂點的值進行設置。

2.2、viewgroup的layout過程首先也是在layout方法中根據父view傳遞過來的四個頂點的位置結合自身情況來得到自身四個頂點的位置,然後也是調用setframe對這個四個頂點的值進行賦值。然後它還要去遍歷它其中所有的子元素,根據自身的位置和子元素的measure過程中得到寬高以及gravity等一些參數來得到子元素的四個頂點的位置,然後調用子元素的layout方法將得到的子元素的四個頂點的位置傳遞子元素的layout過程中去,子元素就可以按這個四個頂點的位置對自身進行佈局。

3、Draw
Draw過程就相對簡單,view的 draw方法中主要通過 4步去繪製一個 view,第一步通過 drawbackgroud去繪製 view的背景,第二步通過 ondraw去繪製 view自身,第三步,如果它是一個viewgroup的話,就會通過 dispatchdraw遍歷所有的子元 素,然後調用子元素的 draw方法,將繪製的流程傳遞到子元素中去, 如果它是一個非容器view的話,它就會跳過這一步,第四步,通過 ondrawscrolbars繪製裝飾。

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