如果說Android上的app是一個有血有肉的人的話,那么人靠衣裝馬靠鞍,那么控件就是把app裝扮的漂漂亮亮的“衣服”。那么安卓的控件到底是如何架構,又是如何渲染的了。
無論是什么控件,在Android中控件只有兩種,一種就是View,另一種是ViewGroup。ViewGroup控件組,一個控件的百寶箱,可以包含各種各樣的控件組,它不僅能夠包含控件還能夠管理着控件。通過ViewGroup,整個控件就至上而下的形成了樹形結構,即我們通常所說的控件樹;父控件負責相應子控件的繪制與測量,並向其傳遞交互事件。安卓系統怎么准確無誤的找到每一個控件?只需要調用findViewbyid的方法就能夠按照深度優先的方法找到每一個控件了。在每個控件樹最頂端,都站立了一個Viewparent對象,這個對象也是這顆控件樹的核心,所有的交互管理事件都是由這個大大負責統一分配和調度,從而起這一個整體宏觀調控的效果。一個控件樹架構如圖所示:

做過Android開發都知道,要使一個activity顯示相應的布局文件,都必須要setContentView。我們要看一下setContentView背后到底發生了什么,Android又是如何將其渲染出來的了。要解答這些問題,我們還是要了解Android的界面架構圖。具體的架構圖如圖所示:

通過上圖所示,我們可以得出這樣的結論。
①每個activity都有一個window對象。
②而每一個window對象通常是由PhoneWindow來實現。
③每個PhoneWindow對象包含DecorView這個根視圖對象,將其視圖展示都是通過這個對象顯示到PhoneWindow上。
④而DecorView被一分為二,一個是TitleView,一個ContentView,TitleView顯示相應的標題,ContentView顯示具體布局,這些應該大家很熟悉。
這樣架構也可以建立一個上文提到的視圖樹,這顆視圖樹長成這個樣子:

這樣控件樹,能夠幫我們解答這樣一個問題為什么requestWindowFeature()一定要在setContentView之前調用才能起效。這是由於TitleBar下面才是ContentView,在ContentView之后設置,這時,只能有ContentView。當程序在oncreate方法調用setcontentView后會調用onResume方法,此時系統會把整個DecorView添加到PhoneWindow中,最終將視圖顯示出來。
