「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
view的创建时机
之前提到Activity的attach过程和view的创建有关
在Activity的attach过程中,会创建一个PhoneWindow对象,这个Window对象是负责view的显示的。
当Activity的生命周期到了onCreate的时候,会通过setContentView的方式设置给Activity中的PhoneWindow,也就是将我们写的布局页面给PhoneWindow,在这个过程中,PhoneWindow会install一个DecorView,这个DecorView是一个最基础的view,分为标题栏与内容框,我们写的布局页面就是放在这个内容框里 因此可以理解为Activity会持有一个PhoneWindow,PhoneWindow负责具体的View的生成,PhoneWindow会在Activity的onCreate这个生命周期中生成DecorView,并填入解析我们写的xml页面
view的工作流程
view的工作有三个过程
- 测量(measure)
- 布局 (layout)
- 绘制(draw) 这个过程其实很好理解,只有先测量出view的所有元素所需要的大小,接着才能进行布局,从而进行view的绘制
测量
测量过程其实是一个递归的过程,对于父容器的测量工作,必然会分解成子元素的测量,而所谓的递归出口就是没有子元素的单个元素
在测量完成之后就可以知道整个View的宽高属性以及各个顶点的位置
布局
当测量完成之后,布局其实就是很简单的一件事,前面说过测量完成后view的各个顶点已经确定,其实其子元素的各个顶点也已经确定,这样只需要通过递归进行布局,那么整个布局过程也就完成了
绘制
绘制有四个流程,分别是绘制背景,绘制自己,绘制子元素,绘制装饰,这个过程同样也是一个递归的过程,首先绘制自己的一些属性,接着通过dispatchDraw来对子类进行绘制