您的位置:首页 > 其它

顶层视图DecorView添加到窗口的过程

2017-02-18 12:15 274 查看

顶层视图DecorView添加到窗口的过程



在ActivityThread中,当Activity被创建完毕后,会将DecorView添加到Window中。

ActivityThread#handleResumeActivity()

final void handleResumeActivity(IBinder token,
boolean clearHide, boolean isForward, boolean reallyResume) {
//...
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
//先将DecorView设为不可见
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
//将DecorView添加到Window中
wm.addView(decor, l);
}
}


再来看windowManager的实现类WindowManagerImpl#addView()

@Override
public void addView(View view, ViewGroup.LayoutParams params) {
mGlobal.addView(view, params, mDisplay, mParentWindow);
}


可以看到,其调用了WindowManagerGlobal#addView()

public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow) {
//...
final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)param;
//...

ViewRootImpl root;
View panelParentView = null;

synchronized (mLock) {
//...

root = new ViewRootImpl(view.getContext(), display);

view.setLayoutParams(wparams);

mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
}

//view(DecorView)和root建立关联
root.setView(view, wparams, panelParentView);
}


在此处,DecorView和Root建立了关联 ViewRootImplw#setView()

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
//...
requestLayout();
//...
}


再来看ViewRootImplw#requestLayout()

@Override
public void requestLayout() {
if (!mHandlingLayoutInLayoutRequest) {
checkThread();
mLayoutRequested = true;
scheduleTraversals();
}
}


调用了scheduleTraversals()

void scheduleTraversals() {
if (!mTraversalScheduled) {
//...
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
//...
}
}


mTraversalRunnable是什么呢? 是一个Runnable对象,内部调用了doTraversal()

final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}


再来看doTraversal()

void doTraversal() {
//...
performTraversals();
//...
}


从performTraversals()开始,进入View的绘制流程,完成VIew的measure、layout、draw三大过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐