View的绘制流程

来源:互联网 发布:js删除数组中元素 编辑:程序博客网 时间:2024/06/05 16:08
http://www.jianshu.com/p/5a71014e7b1b  博客地址


View的绘制如果你有所了解,
基本分为measure、layout、draw 过程,其中比较难理解就是measure过程。

Measure过程:(绘制过程)
对于View的测量,肯定会和MeasureSpec接触,
这个MeasureSpec 封装的是父容器传递给子容器的布局要求,而不是父容器对子容器的布局要求,“传递” 两个字很重要,
更精确的说法应该这个MeasureSpec是由父View的MeasureSpec和子View的LayoutParams通过简单的计算得出一个针对子View的测量要求,
这个测量要求就是MeasureSpec。

* MeasureSpec一共有三种模式:
UPSPECIFIED : 父容器对于子容器没有任何限制,子容器想要多大就多大(不确定测量模式)
EXACTLY: 父容器已经为子容器设置了尺寸,子容器应当服从这些边界,不论子容器想要多大的空间。(精确测量模式)
AT_MOST:子容器可以是声明大小内的任意大小(最大测量模式)


我们编码方便的时候,google就要帮我们计算你match_parent的时候是多大,
wrap_content的是多大,这个计算过程,就是计算出来的父View的MeasureSpec不断往子View传递,
结合子View的LayoutParams 一起再算出子View的MeasureSpec,然后继续传给子View,不断计算每个View的MeasureSpec,
子View有了MeasureSpec才能更测量自己和自己的子View。


简单的理解:
1、如果父View的MeasureSpec 是EXACTLY,说明父View的大小是确切的,
(确切的意思很好理解,如果一个View的MeasureSpec 是EXACTLY,那么它的size 是多大,最后展示到屏幕就一定是那么大)。
2、如果父View的MeasureSpec 是AT_MOST,说明父View的大小是不确定,
最大的大小是MeasureSpec 的size值,不能超过这个值。
3、如果父View的MeasureSpec 是UNSPECIFIED(未指定),表示没有任何束缚和约束,
不像AT_MOST表示最大只能多大,不也像EXACTLY表示父View确定的大小,子View可以得到任意想要的大小,不受约束