《android高級進階》學習筆記(二) View的繪製流程

1 View的繪製流程
1.1 Android中View存在的2種形式:
①單一的View控件;
②包含其它View的ViewGroup容器。

1.2 Android UI管理系統層級關係,如下圖:
UI管理系統層級關係圖
1.3 Android視圖繪製的過程:
①整體流程:ViewRoot:performTraversals()→ViewGroup→View。
②繪製步驟:Measure(測量)→Layout(佈局)→Draw(繪製)。

1.3.1 MeasureSpec
MeasureSepc:一個32位的整型值,高2位表示SpecMode(測量模式),低30位表示某種SpecMode下的SpecSize(規格大小)。

1.3.2 SpecMode(測量模式)
① UNSPECIFIED:不指定測量模式,父視圖沒有限制子視圖的大小,子視圖可以是任意尺寸,通常用於系統內部,應用開發中很少使用;
② EXACTLY:精確測量模式,當視圖的layout_width或者layout_height指定爲具體數值或者match_parent時生效,表示父視圖已經決定了子視圖的精確大小,該模式下View的測量值就是SpecSize的值;
③AT_MOST:最大值測量模式,當視圖的layout_width或者layout_height指定爲wrap_content時生效,表示子視圖的尺寸可以是不超過父視圖允許的最大尺寸的任何尺寸。
對DecorView而言,它的MeasureSpec由窗口尺寸和其自身的LayoutParams共同決定;
對普通View而言,它的MeasureSpec由父視圖的MeasureSpec和其自身的LayoutParams共同決定。

1.3.3 Measure(測量)
Measure是計算View的實際大小,具體的測量操作是由ViewRoot的performMeasure分發到ViewGroup,再由ViewGroup的measureChild方法中傳遞給子View,ViewGroup通過遍歷自身所有的子View,並逐個調用子View的measure方法實現測量操作。在View(ViewGroup)的measure方法中,最終的測量是通過回調onMeasure方法實現的,通常由View的特定子類自己實現,可通過重寫此方法實現自定義View。

1.3.4 Layout(佈局)
Layout用來確定View在父容器中的佈局位置,由父容器獲取子View的位置參數後,調用View的layout方法並將位置參數傳入實現的。重寫onLayout方法,可實現自定義View的佈局流程,若重寫ViewGroup的該方法,可實現ViewGroup中所有View控件的佈局流程。

1.3.5 Draw(繪製)
Draw操作用來將控件繪製出來,繪製的流程從ViewRoot的performDraw方法開始,最終調用到每個View的draw方法繪製每個具體的View,繪製基本分爲六個步驟:
① 繪製View的背景;——>DrawBackground
② 保存canvas的圖層,爲fading做準備;———->canvas.getSaveCount()
③ 繪製View的內容;———> onDraw(canvas)
④ 繪製View的子View;———–>dispatchDraw(canvas)
⑤ 繪製View的fading邊緣並恢復圖層;canvas.drawRect(….);canvas.restoreToCount(….);
⑥繪製View的裝飾(如滾動條)onDrawScrollBars(canvas);

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