一、簡述
VIew的工作流程主要是指measure、layout、draw這三大流程,即測量、布局、繪制。measure確定View的測量寬高;layout確定View的最終寬高和四個頂點(diǎn)的位置;draw則將VIew繪制到屏幕上。
二、measure過程
1. View的measure過程
由measure()方法來完成,measure()方法是final類型的方法,因此不能被重寫。而measure方法會去調(diào)用onMeasure()方法,因此只需要看onMeasure()的實(shí)現(xiàn)即可。具體可以參看上一節(jié)相關(guān)內(nèi)容。
2. ViewGroup的measure過程
除了完成自己的measure外,遞歸地調(diào)用子元素的measure方法
3. 注意事項
View的measure過程完成以后就可以通過getMeasuredWidth/Height方法來獲取View的測量寬高。但是在某些極端情況下,系統(tǒng)可能需要多次measure過程才能最終確定View的測量寬高,因此在這種情況下獲取的View的測量寬高可能是不準(zhǔn)確的。最好在onLayout()方法中去過去View的測量寬高。
三、layout過程
ViewGroup通過layout()方法確定子元素的位置,當(dāng)位置確定以后在onLayout()方法中遍歷所有子元素的layout()方法,如此遞歸。
??layout()方法的大致流程:首先通過setFrame()方法來設(shè)置四個頂點(diǎn)的位置,即初始化mLeft、mRight、mTop、mBottom這四個值。View的四個頂點(diǎn)確定了,那么View在父容器的位置就確定了;然后調(diào)用onLayout()方法,這個方法的作用是父容器確定子元素的位置。和onMeasure()方法類似,onLayout()的具體實(shí)現(xiàn)同樣和具體的布局有關(guān),所以View和ViewGroup均沒有實(shí)現(xiàn)onLayout()方法。
四、draw過程
- 繪制背景background.draw(canvas)
- 繪制自己(onDraw)
- 繪制Children(dispatchDraw)
- 繪制裝飾(onDrawScrollBars)