View的绘制流程

View的事件分发机制在上一篇文章中我简单的梳理了一下View的触摸事件分发,有兴趣的可以看看,帮老弟我看看有啥不足之处,留言我改,共同进步。
即使不看那篇文章相信大家也都知道View主要包含View和ViewGroup(当然,其实ViewGroup也是View的一种)。
在日常开发中很多时候我们仅仅依靠系统自带的控件是无法达到设计师的要求的,这个时候我们通常都需要用到自定义控件。自定义控件一般有两种来源:一种是CV一把梭,这种方式一般很简单,但是有时候与你想要效果会有一些小小的差别;另一种方式就是自己手写,而写自定义控件的基础要求就是要了解View的绘制流程。
View的绘制流程主要包含以下三个方法:

  • onMeasure(测量)
  • onLayout(布局)
  • onDraw(绘制)
    下面我们一一道来:

onMeasure(int widthMeasureSpec, int heightMeasureSpec)

这个方法主要用来测量该布局的大小,可以看到该方法包含两个参数,看上去差不多,只不过一个关于宽,一个关于高。
那么MeasureSpec是个什么东西呢?这是一种通过int类型的数字封装两个参数的设计,大概就类似我们平时把两个数据“A”、“B”融合到一个字符串中“A,B”,然后接受者收到后再进行分割解析。
只不过比我们这种方式更加优雅,MeasureSpec是一个32位的int值,最高位表示测量模式,后31位表示测量的大小。
首先测量模式分为三种:
UNSPECIFIED:不限制大小,这种情况比较少见。
EXACTLY:精确的数值,对应了宽高中的具体值和math_parent。
AT_MOST:不能超过父级的大小。
而View的测量模式主要通过父级的测量模式、父级的测量大小、以及本身所设置的宽高。
View的绘制流程
测量是从小到大,先测量子元素,再测量本身元素。

onLayout(boolean changed, int left, int top, int right, int bottom)

此方法主要用来确认本布局中中子元素的位置,类似的一个方法layout则用来确认自己在父元素的位置,然后layout–>onLayout–>子layout–>子onLayout无穷尽也。
布局是从大到小,先布局本身元素,再布局子元素。

onDraw(Canvas canvas)

绘制先绘制背景,再绘制自己,再绘制子元素。
就像画画一样,先画上,再画山上的花花草草。

结束语

学无止境,共勉之。

参考资料