http://www.reibang.com/writer#/notebooks/14045782/notes/14163616 這篇文章 描述了window的添加過程,這篇繼續(xù)描述UI的繪制流程
ViewRootImpl 的performTraversals()方法中懦尝,分別調(diào)用了performMessure知纷,performLayout,performDraw 三個(gè)方法陵霉,對應(yīng)我們自定義UI時(shí)的最重要的三個(gè)方法屈扎,onMeassure(), onLayout()撩匕,onDraw() 三個(gè)方法,開啟了DecorView的繪制流程。
-
performMeasure
在performMeasure方法中墨叛,可以看到止毕,調(diào)用了mView.measure方法,這個(gè)mView就是decorView漠趁,將款和高的MeasureSpec信息傳入扁凛。
先說一下MeasureSpec的作用,在Measure流程中闯传,系統(tǒng)將View的LayoutParams根據(jù)父容器所施加的規(guī)則轉(zhuǎn)換成對應(yīng)的MeasureSpec谨朝,通過MeasureSpec來進(jìn)行統(tǒng)一的測量。
在measure方法中甥绿,又調(diào)用了onMeasure方法字币,進(jìn)入了View的onMeasure方法中。進(jìn)入了測量
2.performLayout
performLayout 方法中共缕,調(diào)用了host.layout方法, host的賦值是mView洗出,和performMeasure一樣,這個(gè)View是decorView图谷,將decorView擺放到屏幕中翩活。
在host.layout方法中,又調(diào)用了onLayout方法便贵,將整個(gè)Layout的過程交給了onLayout菠镇。
3.performDraw
performDraw調(diào)用了draw方法法。
draw方法中又調(diào)用了 mAttachInfo.mTreeObserver.dispatchOnDraw();
dispatchOnDraw方法又調(diào)用了onDraw()進(jìn)行了繪制承璃。
注意:在自定義viewGroup的時(shí)候利耍,如果想拿到margin,要先復(fù)寫了generateLayoutParams方法。