顶层视图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三大过程。
相关文章推荐
- android视图学习---Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- 在最顶层窗口添加一个视图
- IPhone中给窗口和视图添加背景的方法
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- 为视图窗口添加滚动条
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- VC++单文档分割窗口、在视图中添加控件,并响应该控件的事件
- 最近在编程过程中偶尔会遇到这个错误, 非常烦人, 因为一旦添加事件处理函数就会弹出这个窗口
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Win32:即给编辑框添加新窗口过程,也保留原来的窗口过程属性
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起(写的很好,这个不是从启动app说的,说的是UI是怎么绘制的)
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起 .
- Android应用程序窗口(Activity)的视图对象(View)的创建过程分析
- Android应用程序窗口(Activity)的视图对象(View)的创建过程分析
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- IOS基本界面元素window(窗口)\视图(view)介绍及生命周期和加载过程等
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起