view詳解(二) view的繪製流程

1.ViewRoot

1.1 ViewRoot 是GUI系統管理與GUI系統呈現之間的橋樑,它並不是一個view類型,而是繼承與Handler,主要作用:

    1.1.1:向DecorView分發收到的用戶發起的event事件,如按鍵,觸屏,軌跡球等事件

    1.1.2:與windowManagerSerVice交互,完成整個Activity的GUI的繪製

    1.1.3:Activity,PhoneWindow,ViewRoot對應關係爲:一個Activity對應一個PhoneWindow,在DecorView就包含在PhoneWindow,而ViewRoot是鏈接PhoneWindow與windowManageService的橋樑。

2.mesarue()過程

主要作用:爲整個view樹計算實際的大小,

步驟

1.通過setMeasuredDimension()方法去設置本實際的高和寬

2.如果該view對象是個viewgroup類型,需要重寫該onMeasure()方法,對其子視圖進行遍歷的measure()過程。對於每個子視圖的measure()過程,是通過調用父類的measureChildWithMargins()方法去實現的

如下圖


3.layout佈局過程

主要作用:根據子視圖的大小以及佈局參數,將view放到合適的位置

步驟

1.layout方法會設置該view視圖位於父視圖的座標軸,即left,top,right,bottom(調用setFrame()函數去實現),接下來回掉onLayout方法

2.如果view爲viewgroup類型,需要遍歷每個子視圖childView。調用該子視圖的layout方法去設置他的座標值。


4.draw繪圖過程

由viewRoot對象的performTraversals()方法調用draw()方法發起的繪製該view樹,(每次發起繪圖時,並不會重新繪製每個view樹的視圖,而只會重新繪製那些需要重繪的視圖,更具每個view內部的DRAWN變量來判斷

步驟

1.繪製該view的背景

2.調用onDraw方法繪製視圖本身,(每個view都需要重載該方法,viewGroup不需要實現該方法

3.調用dispatchDraw方法繪製子視圖(只有viewgroup需要實現該方法),dispatchDraw()內部是調用drawChild()去重新回調每個子視圖的draw方法


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