View的绘制流程
View的绘制流程
首先需要知道UI系统的层级关系,如下:绘制会从根视图的performTraversals()方法开始,每个View负责绘制自己,ViewGroup负责通知自己的子View进行绘制,这是一个从上到下遍历视图树的过程。
- MeasureSpec
- Measure
- Layout
- Draw
MeasureSpec
- UNSPECIFIED
不指定测量模式,父视图不限制子视图的大小
- EXACTLY
精确测量模式---视图宽高是具体的或者match_parent的时候
- AT_MOST
最大值模式---wrap_content
Measure
用来计算实际View的大小,由ViewGroup遍历自身所有的子View,并逐个调用子View的Measure方法,最终会调用onMeasure方法,通过其中的setMeasuredDimension方法设置View的测量宽高
如果View没有重写onMeasure方法,会默认调用getDefaultSize来获取View的宽高。
如果View处于Gone状态时是不会对其进行测量的。
Layout
确定View在父容器中的位置:performLayout->layout->onLayout
Draw
绘制控件:1、绘制View的背景 2、如果需要的话保存canvas图层,为fading做准备 3、onDraw绘制View 的内容 4、dispatchDraw绘制View的子View 5、如果需要的话绘制View的fading边缘并恢复图层 6、绘制View的装饰