一克滴、簡(jiǎn)述
VIew的工作流程主要是指measure逼争、layout、draw這三大流程劝赔,即測(cè)量誓焦、布局、繪制着帽。measure確定View的測(cè)量寬高杂伟;layout確定View的最終寬高和四個(gè)頂點(diǎn)的位置;draw則將VIew繪制到屏幕上仍翰。
二稿壁、measure過程
1. View的measure過程
由measure()方法來完成,measure()方法是final類型的方法歉备,因此不能被重寫傅是。而measure方法會(huì)去調(diào)用onMeasure()方法,因此只需要看onMeasure()的實(shí)現(xiàn)即可蕾羊。具體可以參看上一節(jié)相關(guān)內(nèi)容喧笔。
2. ViewGroup的measure過程
除了完成自己的measure外,遞歸地調(diào)用子元素的measure方法
3. 注意事項(xiàng)
View的measure過程完成以后就可以通過getMeasuredWidth/Height方法來獲取View的測(cè)量寬高龟再。但是在某些極端情況下书闸,系統(tǒng)可能需要多次measure過程才能最終確定View的測(cè)量寬高,因此在這種情況下獲取的View的測(cè)量寬高可能是不準(zhǔn)確的利凑。最好在onLayout()方法中去過去View的測(cè)量寬高浆劲。
三嫌术、layout過程
ViewGroup通過layout()方法確定子元素的位置,當(dāng)位置確定以后在onLayout()方法中遍歷所有子元素的layout()方法牌借,如此遞歸度气。
??layout()方法的大致流程:首先通過setFrame()方法來設(shè)置四個(gè)頂點(diǎn)的位置,即初始化mLeft膨报、mRight磷籍、mTop、mBottom這四個(gè)值现柠。View的四個(gè)頂點(diǎn)確定了院领,那么View在父容器的位置就確定了;然后調(diào)用onLayout()方法够吩,這個(gè)方法的作用是父容器確定子元素的位置比然。和onMeasure()方法類似,onLayout()的具體實(shí)現(xiàn)同樣和具體的布局有關(guān)周循,所以View和ViewGroup均沒有實(shí)現(xiàn)onLayout()方法强法。
四、draw過程
- 繪制背景background.draw(canvas)
- 繪制自己(onDraw)
- 繪制Children(dispatchDraw)
- 繪制裝飾(onDrawScrollBars)