一说到自定义View,我们首先想到的就是自定义View绘制的三大流程:measure过程、layout过程、draw过程。 但是一个Activity从启动到显示到手机屏幕上这个过程到底是经历了哪些步骤?自定义View绘制的三大流程(measure过程、layout过程、draw过程)又是发生在Activity从启动到显示的哪个阶段? 带着这些疑问往下看。 根据学习 [Carson带你学Android自定义View文章系列](https://www.jianshu.com/p/146e5cec4863 "Carson带你学Android自定义View文章系列") 后,对于上面两个问题解释就是自定义View的工作流程。 # 自定义View的工作流程 详细请看 [Carson带你学Android:一文梳理自定义View工作流程](https://www.jianshu.com/p/e79a55c141d6 "Carson带你学Android:一文梳理自定义View工作流程") 这篇文章。 接下来就简单概括一下 [Carson带你学Android:一文梳理自定义View工作流程](https://www.jianshu.com/p/e79a55c141d6 "Carson带你学Android:一文梳理自定义View工作流程") 中的内容。 自定义View分为两个阶段:1、自定义View绘制前的准备,2、自定义View绘制(即measure过程、layout过程、draw过程)。 ## 1、自定义View绘制前的准备 首先需要了解以下三个知识点:(ps:具体看 [Carson带你学Android:一文梳理自定义View工作流程](https://www.jianshu.com/p/e79a55c141d6 "Carson带你学Android:一文梳理自定义View工作流程") 文章更详细) ### 1.1、知识储备 #### ViewRoot - 定义 连接器,对应于ViewRootImpl类 - 作用 连接WindowManager 和 DecorView 完成View的三大流程: measure、layout、draw #### DecorView - 定义:顶层View 即 Android 视图树的根节点;同时也是 FrameLayout 的子类 - 作用:显示 & 加载布局 View层的事件都先经过DecorView,再传递到View - 特别说明 内含1个竖直方向的LinearLayout,分为2部分:上 = 标题栏(titlebar)、下 = 内容栏(content)  >在Activity中通过 setContentView()所设置的布局文件其实是被加到内容栏之中的,成为其唯一子View = id为content的FrameLayout中 #### Window、Activity、DecorView与ViewRoot的关系 更加详细 & 具体的介绍,请看文章 [Android自定义View:ViewRoot、DecorView & Window的简介](https://www.jianshu.com/p/28d396a0f05f "Android自定义View:ViewRoot、DecorView & Window的简介") 首先概括一下 Window、Activity、DecorView与ViewRoot各自的作用。  然后看一下最终显示在屏幕上时Window、Activity、DecorView的关系。  一个屏幕显示的视图从最外层到最里层进行分析就是:最外层是一个Activity,Activity里面是一个Window,Window里面是所有视图的根视图DecorView,DecorView里面包含一个竖直方向的LinearLayout,分为2部分:上 = 标题栏(titlebar)、下 = 内容栏(content),下面部分的内容栏(content),放的就是Activity中通过 setContentView()所设置的布局文件。  DecorView是视图,Window是视图的承载器,Activity控制生命周期和处理事件,1个Activity包含1个Window,其中,真正控制视图的是Window。 而ViewRoot的作用就是连接WindowManagerService和DecorView,直白来讲就是,Window需要通过ViewRoot控制视图进行绘制或其他交互。 ### 1.2、绘制准备 更加详细 & 具体的介绍,请看文章 [Carson带你学Android:自定义View绘制准备-DecorView创建](https://www.jianshu.com/p/ac3262d233af "Carson带你学Android:自定义View绘制准备-DecorView创建") 绘制准备,创建PhoneWindow类、DecorView类、ViewRootmpl类等 下面总结View绘制前的准备,主要包括:DecorView创建 & 显示。 总结如下: #### DecorView的创建 >DecorView是显示的顶层View,那么View的绘制准备从DecorView创建开始说起。 DecorView的创建开始是从大家最熟悉的setContentView()开始。 步骤如下: 1. 创建Window抽象类的子类PhoneWindow类的实例对象; 2. 为PhoneWindow类对象设置WindowManager对象; 3. 为PhoneWindow类对象创建1个DecroView类对象(根据所选的主题样式增加); 4. 为DecroView类对象中的content增加Activity中设置的布局文件。 此时,DecorView(即顶层View)已创建和添加Activity中设置的布局文件中,但目前仍未显示出来,即不可见。 #### DecorView的显示 >在主线程创建时,会调用handleResumeActivity(),DecorView的显示操作从此处开始。 1. 将DecorView对象添加到WindowManager中; 2. 创建ViewRootImpl对象; 3. WindowManager将DecorView对象交给ViewRootImpl对象; 4. ViewRootImpl对象通过Handler向主线程发送了一条触发遍历操作的消息:performTraversals();该方法用于执行View的绘制流程(measure、layout、draw)。 ViewRootImpl对象中接收的各种变化(如来自WmS的窗口属性变化、来自控件树的尺寸变化、重绘请求等都引发performTraversals()的调用及完成相关处理,并最终显示到可见的Activity中。整个流程如图下所示。  从上面的结论可以看出: - 一次次performTraversals()的调用驱动着控件树有条不紊的工作; - 一旦此方法无法正常执行,整个控件树都将处于僵死状态; - 因此performTraversals()可以说是ViewRootImpl类对象的核心逻辑。而performTraversals()的后续逻辑,则是View绘制的三大流程:测量流程(measure)、布局流程(layout)、绘制流程(draw)。 #### 总结  ## 2、自定义View绘制 自定义View绘制的三大流程:measure过程、layout过程、draw过程。 具体看 [Carson带你学Android:一文梳理自定义View工作流程](https://www.jianshu.com/p/e79a55c141d6 "Carson带你学Android:一文梳理自定义View工作流程") 文章 最后编辑:2023年03月10日 ©著作权归作者所有
最新回复