基於android 4.4上源碼分析:android
setContentView流程:源碼分析
getwindow() ->setContentView() -> installDecor() -> addView()orm
getWindow()返回的是PhoneWindow遞歸
installDecor()生成了window的rootView decorViewget
addView() 會致使 decorView -> requestLayout() -> getViewRootImpl() -> performTraversals()源碼
performTravsals()裏面工做流程就是遞歸的作:工作流
measure() -> layout() -> draw()form
measure()對於不一樣ViewGroup的類型測量過程不同(Framelayout、LinearLayout、RelativeLayout等)rsa
FrameLayout 只要對全部的子View測量一篇,測量的速度是最快的request
LinearLayout也是隻要對全部的子View測量一篇,可是當有Weight屬性時須要從新對最大寬度或者高度從新進行一次測量
因此寫Layout時 指定layout_width="0dp"或者layout_height="0dp"能夠減小測量時間
RelativeLayout須要對子view進行一次橫向測量和縱向測量。測量速度最慢,尤爲是層次結構比較深時。
layout()基本是肯定各個view在畫布座標。
draw()生成displaylist給GPU生成圖像。
對於有多個子View的ViewGroup,都是先從最下面那個子view(index:0)開始進行measure ,layout ,draw.