View的繪制流程概述
- Window的創(chuàng)建:
Activity啟動時最終會調(diào)用ActivityThread.performLaunchActivity來完成啟動腿时,這個方法會通過類加載器創(chuàng)建activity的實例對象,并通過Activity.attach()方法創(chuàng)建Window類的實例化對象PhoneWindow.這樣window就創(chuàng)建好了批糟。
2.DecorView的創(chuàng)建:
Activity.onCreate會調(diào)用setContentView, Activity.setContentView其實是通過PhoneWindow.setContentView將布局文件加載進(jìn)來生成DecorView,這個DecorView就是ViewTree的根節(jié)點(diǎn)徽鼎。
3.DecorView的顯示:
HandleResumeActivity回調(diào)用Activity.onResume弹惦,接著調(diào)用Activity.makeVisible()在這個方法中會調(diào)用windowManger.addView,而WindowManager是個接口叹括,具體是交給WindowManagerImpl來實現(xiàn)的宵荒。而交給WindowManagerImpl會讓W(xué)indowManagerGlobal 的addView()方法去實現(xiàn)净嘀。在這里會創(chuàng)建ViewRootImpl,ViewRootImpl才是真正負(fù)責(zé)view的繪制,viewRootImpl會調(diào)用requestLayout()->scheduleTraversals->performTraversals,最終會通過調(diào)用PerformTraversals來進(jìn)行測量暑刃,布局,繪制流程岩臣。
Activity Window WindowManager DecorView ViewRootImpl的關(guān)系概述
image.png
Activity其實并不負(fù)責(zé)視圖的繪制,它其實類似一個大管家統(tǒng)籌全局架谎,負(fù)責(zé)處理生命周期和事件分發(fā),具體處理的事務(wù)都是委托給別人來處理土全。表示視圖的是window窗口類会涎,但是window是個抽象類,其具體實現(xiàn)是PhoneWindow類末秃。而PhoneWindow類里持有一個DecorView對象,這個DecorView其實才是我們最經(jīng)常接觸的根ViewRoot.DecorView是一個FrameLayout子類惰匙,包含了上面一個actionBar和下面一個id為Content的FrameLayout.我們在onCreate中調(diào)用setcontentView(R.layout.xxx)就是將布局文件賦值給這個id為content的FrameLayout.而真正負(fù)責(zé)事件處理和view的繪制流程是ViewRootImpl類贺待。ActivityThread啟動后會調(diào)用handleResumeActivity去讓windowManger調(diào)用addView,在addView中ViewRootImpl最終會調(diào)用performTraversals()進(jìn)行view的繪制。因此ViewRootImpl是WindowManager和DecorView的中間橋梁秃臣。