Activity視窗繪製和Window、PhoneWindow、DecorView、setContentView的執行順序
-- DecorView構成
-- Window、PhoneWindow、DecorView、setContentView
Window窗口布局 --- DecorView淺析- https://www.cnblogs.com/yogin/p/4061050.html
Activity onCreate()中呼叫setContentView(R.layout.custom_layout)來實現想要的頁面佈局,我們知道,頁面都是依附在視窗之上的,而DecorView即是視窗最頂層的檢視。Android frameworks中,與視窗檢視處理相關的類,主要是Window及其實現類PhoneWindow。
public class PhoneWindow extends Window implements MenuBuilder.Callback {
//...
//視窗頂層View
private DecorView mDecor;
//所有自定義View的根View, id="@android:id/content"
private ViewGroup mContentParent;
}
Window-> PhoneWindow-> DecorView-> Activity;
Activity#setContentView- Activity#attach- PhoneWindow#setContentView- PhoneWindow#installDecor- PhoneWindow#generateDecor(DecorView)- PhoneWindow#generateLayout- DecorView新增至Window- WindowManagerImpl#addView- WindowManagerGlobal#addView- ViewRootImpl#setView;
DecorView其實是PhoneWindow中的一個內部類,本質上也是一個View,其只是擴充套件了FrameLayout的實現
private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {}
DecorView是整個ViewTree的最頂層View,它是一個FrameLayout佈局,代表了整個應用的介面。通過setContentView方法,建立了DecorView和載入了我們提供的佈局,但是這時,我們的View還是不可見的,因為我們僅僅是載入了佈局,並沒有對View進行任何的測量、佈局、繪製工作。在View進行測量流程之前,還要進行一個步驟,那就是把DecorView新增至window中,然後經過一系列過程觸發ViewRootImpl#performTraversals方法,在該方法內部會正式開始測量、佈局、繪製這三大流程。
將DecorView新增至Window;
每一個Activity元件都有一個關聯的Window物件,用來描述一個應用程式視窗。每一個應用程式視窗內部又包含有一個View物件,用來描述應用程式視窗的檢視。上文分析了建立DecorView的過程,現在則要把DecorView新增到Window物件中。
最後通過WMS呼叫ViewRootImpl#performTraverals方法開始View的測量、佈局、繪製流程
DecorView是activity視窗的根檢視。每個activity都對應一個視窗window,這個視窗是PhoneWindow的例項,PhoneWindow對應的佈局是DecirView,是一個FrameLayout,DecorView內部又分為兩部分,一部分是ActionBar,另一部分是ContentParent,即activity在setContentView對應的佈局。
事件分發機制:down move up; View的繪製:測量、佈局、繪製流程;
一、DecorView為整個Window介面的最頂層View。 二、DecorView只有一個子元素為LinearLayout。代表整個Window介面,包含通知欄,標題欄,內容顯示欄三塊區域。 三、LinearLayout裡有兩個FrameLayout子元素。