###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绘制流程的总结,如有任何疑问欢迎留言提问,博主每天都会查看。
