源码总结
- 创建Window抽象类的子类PhoneWindow类的实例对象;
- 为PhoneWindow类对象设置WindowManager对象;
- 为PhoneWindow类对象创建1个DecroView类对象(根据所选的主题样式增加);
- 为DecroView类对象中的content增加Activity中设置的布局文件。
此时,DecorView(即顶层View)已创建和添加Activity中设置的布局文件中,但目前仍未显示出来,即不可见。
2. DecorView的显示
源码分析
在主线程创建时,会调用handleResumeActivity(),DecorView的显示操作从此处开始。
源码总结
- 将DecorView对象添加到WindowManager中;
- 创建ViewRootImpl对象;
- WindowManager将DecorView对象交给ViewRootImpl对象;
- ViewRootImpl对象通过Handler向主线程发送了一条触发遍历操作的消息:performTraversals();该方法用于执行View的绘制流程(measure、layout、draw)。
ViewRootImpl对象中接收的各种变化(如来自WmS的窗口属性变化、来自控件树的尺寸变化、重绘请求等都引发performTraversals()的调用及完成相关处理,并最终显示到可见的Activity中。整个流程如图下所示。
从上面的结论可以看出:
- 一次次performTraversals()的调用驱动着控件树有条不紊的工作;
- 一旦此方法无法正常执行,整个控件树都将处于僵死状态;
- 因此performTraversals()可以说是ViewRootImpl类对象的核心逻辑。而performTraversals()的后续逻辑,则是View绘制的三大流程:测量流程(measure)、布局流程(layout)、绘制流程(draw)。
3. 总结
- 本文全面总结自定义
View
绘制前的准备,主要包括:DecorView
创建 & 显示,具体总结如下: - 工作流程机制
1. DecorView的创建
DecorView是显示的顶层View,那么View的绘制准备从DecorView创建开始说起。
源码分析
DecorView的创建开始是从大家最熟悉的setContentView()开始。