View的绘制流程

View的绘制流程

首先需要知道UI系统的层级关系,如下:绘制会从根视图的performTraversals()方法开始,每个View负责绘制自己,ViewGroup负责通知自己的子View进行绘制,这是一个从上到下遍历视图树的过程。
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的装饰