1娘香、Activity窗口結(jié)構(gòu)
2办龄、窗口機制
1)Window
每一個Activity都包含一個Window對象,Window對象通常由PhoneWindow實現(xiàn)诀姚,Window位于 /sdk/sources/android-27/android/view/Window.java玷禽。該類是一個抽象類呀打,提供了繪制窗口的一組通用API贬丛「椋可以將之理解為一個載體,各種View在這個載體上顯示恭应。
2)PhoneWindow
位于//sdk/sources/android-27/com/android/internal/policy/impl/PhoneWindow.java耘眨。該類繼承于Window類,是Window類的具體實現(xiàn)胆屿,即我們可以通過該類具體去繪制窗口偶宫。并且,該類內(nèi)部包含了一個DecorView對象憎兽,該DectorView對象是所有應(yīng)用窗口(Activity界面)的根View结闸。 簡而言之,PhoneWindow類是把一個FrameLayout類即DecorView對象進(jìn)行一定的包裝,將它作為應(yīng)用窗口的根View蔫耽,并提供一組通用的窗口操作接口。
它是Android中的最基本的窗口系統(tǒng)匙铡,每個Activity 均會創(chuàng)建一個PhoneWindow對象鳖眼,是Activity和整個View系統(tǒng)交互的接口。
3)DecorView
是PhoneWindow類的內(nèi)部類(后面版本將DecorView拿出來了)矿瘦。該類是一個FrameLayout的子類,并且是PhoneWindow的子類缚去,該類就是對普通的FrameLayout進(jìn)行功能的擴(kuò)展,更確切點可以說是修飾(Decor的英文全稱是Decoration枕荞,即“修飾”的意思),比如說添加TitleBar(標(biāo)題欄)搞动,以及TitleBar上的滾動條等 。DecorView是當(dāng)前Activity所有View的祖先矗烛,它并不會向用戶呈現(xiàn)任何東西狮惜,它主要有如下幾個功能,可能不全:
A.? Dispatch ViewRoot分發(fā)來的key虱而、touch、trackball等外部事件牡拇;
B.? DecorView有一個直接的子View穆律,我們稱之為System Layout,這個View是從系統(tǒng)的Layout.xml中解析出的,它包含當(dāng)前UI的風(fēng)格剔蹋,如是否帶title、是否帶process bar等泣崩÷蹇冢可以稱這些屬性為Window decorations。
C.? 作為PhoneWindow與ViewRoot之間的橋梁买优,ViewRoot通過DecorView設(shè)置窗口屬性。//可以這樣獲取 View view = getWindow().getDecorView();
D.? DecorView只有一個子元素為LinearLayout烘跺。代表整個Window界面,包含通知欄液荸,標(biāo)題欄脱篙,內(nèi)容顯示欄三塊區(qū)域绊困。DecorView里面TitleView:標(biāo)題,可以設(shè)置requestWindowFeature(Window.FEATURE_NO_TITLE)取消掉ContentView:是一個id為content的FrameLayout秤朗。我們平常在Activity使用的setContentView就是設(shè)置在這里,也就是在FrameLayout上
3硝皂、繪制流程
大多數(shù) Android 開發(fā)都知道自定義 View 需要關(guān)注的幾個方法:onMeasure()作谭、onLayout()?和?onDraw(),這其實也是每個 View 至關(guān)重要的繪制流程贝或。
當(dāng)一個應(yīng)用啟動時會啟動一個主Activity锐秦,Android會根據(jù)Activity的布局對它進(jìn)行繪制,從根視圖ViewRoot的performTraversals()方法開始酱床,從上到下遍歷整顆視圖樹,每個View控件負(fù)責(zé)繪制自己慷垮;而ViewGroup還需要通知自己的子View進(jìn)行繪制。視圖的繪制過程可以分為三個步驟:測量(Measure)汤纸、布局(Layout)、繪制(Draw)贮泞。