###measure
measure测量是一个从上到下的递归过程。在measure方法中有几个比较重要的参数:
- ViewGroup.LayoutParams
它是一个用来指定视图高度和宽度的参数,对于视图的宽高可以设置为wrap_content/match_parent/具体数值。 - MeasureSpec
它是一个32位int值,最高的两位表示**SpecMode**(测量模式),后30位表示该测量模式下的大小。在一个View控件measure的过程中,系统会将这个View的layoutParams结合父容器生成一个MeasureSpec。
其实LayoutParams最终也是设置MeasureSpec,把MeasureSpec返还给父容器,告诉如何测量这个View控件的大小。
specMode有三种:
不确定的(父控件不会对子控件有任何的约束,可以设置为任意尺寸,在实际项目中基本不用);
EXACTLY:父容器为子视图确定一个大小,无论子视图希望多大,都必须在这个范围内;
AT_MOST:父容器为子视图指定一个最大尺寸,它对应的属性是wrap_content。 - 三个重要方法
(1)measure
这个方法定义在View类中,它最终实现还是调用onMeasure方法。
(2)onMeasure
onMeasure方法中最终调用的是setMeasuredDimension方法。
(3)setMeasuredDimension
这个方法就是为View的成员变量measuredWidth和measuredHeight赋值。
###layout
layout也是从上到下递归的过程。onLayout在ViewGroup中是一个抽象方法,如果自定义ViewGroup就一定要实现onLayout。在onLayout中最终需要对每一个子视图setChildFrame。
###draw
draw里有两个非常容易混淆的方法:
- invalidate
该方法请求调用View的draw方法,如果此时视图的大小没有发生变化,不会调用measure和layout方法。 - requestLayout
当布局发生变化,调用这个方法就会触发measure和layout方法,但不会调用draw方法。
###最后
以上就是我对VIew绘制流程的总结,如有任何疑问欢迎留言提问,博主每天都会查看。