【Android View相关】View的绘制机制

xiaoxiao2021-02-28  25

###View树的绘制流程 measure(计算视图大小)-->layout(安置视图位置)-->draw(重绘视图) 在onMeasure方法中会递归对所有子元素进行测量,layout过程与measure过程类似,也是一个递归的过程。

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

转载请注明原文地址: https://www.6miu.com/read-2628407.html

最新回复(0)