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方法