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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值