您的位置:首页 > 移动开发 > Android开发

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

2018-02-18 23:18 295 查看

View树的绘制流程

measure(计算视图大小)–>layout(安置视图位置)–>draw(重绘视图)

在onMeasure方法中会递归对所有子元素进行测量,layout过程与measure过程类似,也是一个递归的过程。

measure



measure测量是一个从上到下的递归过程。在measure方法中有几个比较重要的参数:

1. ViewGroup.LayoutParams

它是一个用来指定视图高度和宽度的参数,对于视图的宽高可以设置为wrap_content/match_parent/具体数值。

2. MeasureSpec

它是一个32位int值,最高的两位表示SpecMode(测量模式),后30位表示该测量模式下的大小。在一个View控件measure的过程中,系统会将这个View的layoutParams结合父容器生成一个MeasureSpec。

其实LayoutParams最终也是设置MeasureSpec,把MeasureSpec返还给父容器,告诉如何测量这个View控件的大小。

specMode有三种:

不确定的(父控件不会对子控件有任何的约束,可以设置为任意尺寸,在实际项目中基本不用);

EXACTLY:父容器为子视图确定一个大小,无论子视图希望多大,都必须在这个范围内;

AT_MOST:父容器为子视图指定一个最大尺寸,它对应的属性是wrap_content。

3. 三个重要方法

(1)measure

这个方法定义在View类中,它最终实现还是调用onMeasure方法。

(2)onMeasure



onMeasure方法中最终调用的是setMeasuredDimension方法。

(3)setMeasuredDimension



这个方法就是为View的成员变量measuredWidth和measuredHeight赋值。

layout

layout也是从上到下递归的过程。onLayout在ViewGroup中是一个抽象方法,如果自定义ViewGroup就一定要实现onLayout。在onLayout中最终需要对每一个子视图setChildFrame。

draw

draw里有两个非常容易混淆的方法:

1. invalidate

该方法请求调用View的draw方法,如果此时视图的大小没有发生变化,不会调用measure和layout方法。

2. requestLayout

当布局发生变化,调用这个方法就会触发measure和layout方法,但不会调用draw方法。

最后

以上就是我对VIew绘制流程的总结,如有任何疑问欢迎留言提问,博主每天都会查看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: