一、简述
VIew的工作流程主要是指measure、layout、draw这三大流程,即测量、布局、绘制。measure确定View的测量宽高;layout确定View的最终宽高和四个顶点的位置;draw则将VIew绘制到屏幕上。
二、measure过程
1. View的measure过程
由measure()方法来完成,measure()方法是final类型的方法,因此不能被重写。而measure方法会去调用onMeasure()方法,因此只需要看onMeasure()的实现即可。具体可以参看上一节相关内容。
2. ViewGroup的measure过程
除了完成自己的measure外,递归地调用子元素的measure方法
3. 注意事项
View的measure过程完成以后就可以通过getMeasuredWidth/Height方法来获取View的测量宽高。但是在某些极端情况下,系统可能需要多次measure过程才能最终确定View的测量宽高,因此在这种情况下获取的View的测量宽高可能是不准确的。最好在onLayout()方法中去过去View的测量宽高。
三、layout过程
ViewGroup通过layout()方法确定子元素的位置,当位置确定以后在onLayout()方法中遍历所有子元素的layout()方法,如此递归。
layout()方法的大致流程:首先通过setFrame()方法来设置四个顶点的位置,即初始化mLeft、mRight、mTop、mBottom这四个值。View的四个顶点确定了,那么View在父容器的位置就确定了;然后调用onLayout()方法,这个方法的作用是父容器确定子元素的位置。和onMeasure()方法类似,onLayout()的具体实现同样和具体的布局有关,所以View和ViewGroup均没有实现onLayout()方法。
四、draw过程
- 绘制背景background.draw(canvas)
- 绘制自己(onDraw)
- 绘制Children(dispatchDraw)
- 绘制装饰(onDrawScrollBars)