View繪制流程
相關(guān)對(duì)象介紹
ViewRootImpl
- 連接WindowManager 和 DecorView
- 完成View繪制的三大流程: measure觉既、layout、draw
- implements ViewParent
- 分發(fā)底層傳遞的行為事件
DecorView
- Android 視圖樹的根節(jié)點(diǎn),同時(shí)也是 FrameLayout 的子類
setContentView
- Activity setContentView 調(diào)用了PhoneWindow的setContentView()
- PhoneWindow的setContentView() 調(diào)用->installDecor() 調(diào)用->generateDecor()-> new DecorView()
流程
- ActivityThread的performLaunchActivity()調(diào)用 activity.attach()
- Activity的attach() 初始化了PhoneWindow和WindowManager new PhoneWindow setWindowManager()
- ActivityThread執(zhí)行mInstrumentation.callActivityOnCreate()方法侵状,然后執(zhí)行Activity.onCreate()塔淤,再執(zhí)行Activity setContentView
- Activity setContentView 調(diào)用了PhoneWindow的setContentView()
- PhoneWindow的setContentView() 調(diào)用->installDecor() 調(diào)用->generateDecor()-> new DecorView()
- 此時(shí) DecorView PhoneWindow 都已經(jīng)創(chuàng)建
- ActivityThread的handleResumeActivity() 調(diào)用WindowManagerImpl 的addView()
- WindowManagerImpl 的addView 實(shí)際是調(diào)用WindowManagerGlobal addView() , 在addView WindowManagerGlobal 中創(chuàng)建ViewRootImpl, 并將DecorView傳入ViewRootImpl,完成windowManagerService和View的連接
- ViewRootImpl performTraversal()->performMeasure() performLayout() performDraw
//===========ActivityThread.java==========
final void handleResumeActivity(...) {
......
//跟蹤代碼后發(fā)現(xiàn)其初始賦值為mWindow = new PhoneWindow(this, window, activityConfigCallback);
r.window = r.activity.getWindow();
//從PhoneWindow實(shí)例中獲取DecorView
View decor = r.window.getDecorView();
......
//跟蹤代碼后發(fā)現(xiàn)涌献,vm值為上述PhoneWindow實(shí)例中獲取的WindowManager榜田。
ViewManager wm = a.getWindowManager();
......
//當(dāng)前window的屬性,從代碼跟蹤來看是PhoneWindow窗口的屬性
WindowManager.LayoutParams l = r.window.getAttributes();
......
wm.addView(decor, l);
......
}
root = new ViewRootImpl(view.getContext(), display);
root.setView(view, wparams, panelParentView);
// =====================ViewRootImpl.java=================
private void performTraversals() {
......
int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);
......
// Ask host how big it wants to be
performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
......
performLayout(lp, mWidth, mHeight);
......
performDraw();
}
View WindowManager Window關(guān)系圖