背景
我們想要自定義View那么首先就得先明白View的工作流程和原理,知道它是怎么繪制出的。
初始ViewRoot和DecorView
View的繪制主要是三大流程统刮,measure表牢,layout,draw這三個(gè)過(guò)程斩狱,那么View又是怎么與我們的Activity所關(guān)聯(lián)起來(lái)的呢耳高?
ViewRoot對(duì)應(yīng)于ViewRootImpl類,他是連接WindowManager和DecorView的紐帶所踊,View的三大流程都是由它來(lái)完成的泌枪。當(dāng)Activity創(chuàng)建的時(shí)候DecorView會(huì)被添加到Window里面,同時(shí)也會(huì)創(chuàng)建ViewRootImpl對(duì)象秕岛,并將這個(gè)對(duì)象與DecorView建立連接碌燕。
root = new ViewRootImpl(View.getContext(),display); root.setView(view,wparams,panelParentView);
perfromTraversals流程
View的繪制流程是從ViewRoot的preformTraversals方法開始的误证,他經(jīng)過(guò)measure、layout修壕、draw三個(gè)過(guò)程最終將View繪制出來(lái)愈捅,其中measure用來(lái)測(cè)量View的寬和高,layout用來(lái)確定View在父容器中的放置位置,而draw則負(fù)責(zé)將View繪制在屏幕上包个,主要流程如下:削樊。
這樣preformTraversals它就會(huì)依次調(diào)用 preformMeasure , preformLayout和preformDraw這三個(gè)方法,三個(gè)方法的流程分別從父容器傳遞到子容器譬巫,如此反復(fù),就完成了整個(gè)View的遍歷督笆。
簡(jiǎn)單總結(jié)
measure決定了View的寬\高芦昔,Measure完成之后可以通用過(guò)getMeasureHeight和getMwasureWidth來(lái)獲得View的高度和寬度,在幾乎多有的情況下他就是View 最終的寬高娃肿,但是特殊情況除外咕缎,Layout的過(guò)程決定了View的四個(gè)定點(diǎn)的位置和實(shí)際的View的寬\高,完成之后可以通過(guò) getTop料扰,getBottom凭豪,getLeft,getRight來(lái)獲取View四個(gè)方向上的坐標(biāo)记罚,并通過(guò)getWidth和getHeight來(lái)獲得View的最終的寬高墅诡,Draw則決定了View的顯示,只有draw方法完成之后View才會(huì)真正的顯示在布局上 桐智。