Activity:控制聲明周期和處理事件牍疏,統(tǒng)籌視圖的添加與顯示
Window:是視圖承載器,內(nèi)部持有一個DecorView,WindowManager將DecorView加載其中拨齐,并將DecorView交給ViewRoot鳞陨,進(jìn)行視圖繪制以及交互
DecorView:為Android視圖樹的根節(jié)點視圖,DecorView中包含一個LinearLayout
瞻惋,他是一個垂直的布局厦滤,由三部分組成,第一個為ViewStub,第二個為標(biāo)題欄歼狼,第三個為內(nèi)容欄
ViewRoot:這個類的作用就是鏈接WindowManagerService和DecorView,View的三大流程:Measure掏导、Layout、Draw都是通過它來完成的
截屏2020-08-21 下午8.48.45.png
DecorView的創(chuàng)建
簡單的來說就是創(chuàng)建一個Decorview,之后通過LayoutInflater.inflate加載出要我們xml中的布局羽峰,之后通過decorview.add(view)將布局加載進(jìn)來趟咆,
DecorView的顯示
通過調(diào)用makeVisible方法,其中wm.addView在其內(nèi)部創(chuàng)建了一個ViewRootImpl對象,負(fù)責(zé)繪制各個子View
void makeVisible() {
if (!mWindowAdded) {
ViewManager wm = getWindowManager();
wm.addView(mDecor, getWindow().getAttributes());//將Deco rView添加到
WindowManager
mWindowAdded = true;
}
mDecor.setVisibility(View.VISIBLE);//DecorView可見 }
addView方法
public void addView(View view, ViewGroup.LayoutParams params, Display display, Window parentWindow) {
final WindowManager.LayoutParams wparams = (WindowManager.La youtParams) params;
......
synchronized (mLock) {
ViewRootImpl root;
//實例化一個ViewRootImpl對象
root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
}
......
try {
//將DecorView交給ViewRootImpl root.setView(view, wparams, panelParentView);
} catch (RuntimeException e) {
}
}
總結(jié)
通過以上了解可以知道梅屉,Activity就像個控制器值纱,不負(fù)責(zé)視圖部分。Window像個 承載器坯汤,裝著內(nèi)部視圖虐唠。DecorView就是個頂層視圖,是所有View的最外層布局惰聂。 ViewRoot像個連接器疆偿,負(fù)責(zé)溝通,通過硬件的感知來通知視圖庶近,進(jìn)行用戶之間的 交互翁脆。