View绘制相关知识点
.
.
.
一.view树的绘制流程
大体上分为:measure------>layout------>draw这三个步骤
二.measure方法:
参数1.ViewGroup.layoutParams:这个参数表示了子视图的大小,一般有三种类型:
match_parent:表示是子视图想和父控件一样大(不包括padding值)
warp_content:整个父控件只要能包含这个子控件就行
以及具体的长宽值。
参数2:MeasureSpec: 这个参数表示了测量规格,其实是一个32位的int值。其中最高的两位代表了测量模式,后面的30位表示了这种测量模式下测量出来的大小。
其中测量模式有三种:
1.不确定的,父控件不会对子控件的大小有任何约束,但不可以超出屏幕的尺寸(几乎不会用到)
2.exactly:子视图可以在父容器限制的尺寸范围内设置大小
3.atmost:父容器给子视图指定了最大的大小,子视图的大小必须在这个范围内。这种模式下父控件无法获取子控件的大小,只能由子控件自行测量尺寸。
.
.
.
measure方法中比较重要的回调方法
measure()方法:通过上方的MeasureSpec参数获取到了控件的宽高,再通过onMeasure()方法进行绘制。在onMeasure()方法中又调用了setMeasureDimension()方法,将所有测量到的数据传入setMeasureDimension()。到此,测量流程结束
在安卓中有一种重新测量机制,当父容器觉得子视图测量出来的数据不合理,则会再次进行measure过程。如果还是不合理,就会更改测量模式来进行再次测量。
三.Layout方法
layout方法与measure类似,也是树形地遍历view树,调用子控件的layout方法来进行对子控件的位置摆放。
在layout方法中同样的也调用了onLayou方法。
四.draw方法
在屏幕上绘制控件的方法。
其中有两个重要的回调方法:
invalidate():向系统发出请求,如果控件的大小没有变化,则不会调用layout这个过程
**requestLayout()方法:**当试图发生变化的时候,如大小的变化,方向的变化等就会调用这个方法。在这个方法内部重新进行measure过程和layout过程。但不会调用draw方法