第五大容器佈局——流式佈局

醉墨重生發表於2018-02-25

①、performLayout :View -> layout() -> onLayout()

②、擺放子佈局 for迴圈所有子View, 前提不是GONE,呼叫child.layout()

③、performDraw() : View -> draw() -> drawBackground();//畫背景
onDraw(canvas);// 畫自己 ViewGroup 預設情況下不會呼叫
dispatchDraw(canvas);// 畫子View 不斷的迴圈呼叫子View的 draw()

面試 [ View的繪製流程]

第一步 performMeasure():用於指定和測量layout中所有控制元件的寬高,對於ViewGroup,先去測量裡面的子孩子,根據子孩子的寬高再來計算和指定自己的寬高,對於View,它的寬高是由自己和父佈局決定的。

第二步 performLayout(): 用於擺放子佈局,for迴圈所有子View,用child.layout()擺放ChildView

第三步 performDraw(): 用於繪製自己還有子View , 對於ViewGroup首先繪製自己的背景,for迴圈繪製子View呼叫子View的draw()方法, 對於View繪製自己的背景,繪製自己顯示的內容(TextView)

思考問題:

  • 如果要獲取View的高度,前提肯定需要呼叫測量方法,測量完畢之後才能獲取寬高

  • View的繪製流程是在 onResume() 之後才開始(Activity 啟動流程的原始碼)

  • addView setVisibility 等等 會呼叫requestLayout(); 重新走一遍View的繪製流程

  • 優化的時候,根據知道原始碼寫程式碼的時候優化, onDraw() 不要佈局巢狀,等等

1.流式佈局:我之前寫過二篇文章:http://blog.csdn.net/qq_24675479/article/details/78921070,動態新增流式佈局http://blog.csdn.net/qq_24675479/article/details/78928339這裡不闡述了

2.自定義View和ViewGroup套路總結

2.1 自定義View的套路:

    2.1.1 自定義屬性,獲取自定義屬性(達到配置的效果) 
    2.1.2 onMeasure()方法用於測量計算自己的寬高,前提是繼承自View,如果是繼承自系統已有的 TextView , Button ,已經給你計算好了寬高
    2.1.3 onDraw() 用於繪製自己的顯示 
    2.1.4 onTouch() 用於與使用者互動

2.2 自定義ViewGroup的套路:

    2.2.1 自定義屬性,獲取自定義屬性(達到配置的效果)很少有

    2.2.2 onMeasure() 方法,for迴圈測量子View,根據子View的寬高來計算自己的寬高

    2.2.3 onDraw() 一般不需要,預設情況下是不會呼叫,如果你要繪製需要實現dispatchDraw()方法

    2.2.4 onLayout() 用來擺放子View,前提是不是GONE的情況

    2.2.5 在很多情況下不會繼承自ViewGroup ,往往是繼承 系統已經提供好的ViewGroup 如 ViewPager ScrollView  RelativeLayout

相關文章