MeasureSpect之三种模式(补)

前言

之前在自定义控件的第二篇(点我)在onMeasure里面介绍了MeasureSpect有三种模式,但是总感觉没有将的很清楚,这里再写一篇作为补充.

MeasureSpect三种模式

三种模式是EXACTLY,UNSPECIFIED,AT_MOST,分别代表精确大小,不精确大小,最大值;通过MeasureSpect.getMode就可以获得该值,那么MeasureSpect到底是由什么决定的呢?

MeasureSpect是由LayoutParameter通过父容器的施加的规则产生的

下面我们来看一看三种模式产生的情况.

MeasureSpec.EXACTLY

父容器已经精确的检测出了子View的大小,子view的大小就是MeasureSpect.getSize()的值.

适用情况:
    a.子View的LayoutParameter使用具体的值(如:宽高为100dp),不管父容器的spectMode为什么,系统返回给子View的mode为EXACTLY,系统返回给子View的大小为子V诶额外自己指定的大小(100dp)
    b.子View的LayoutParams采用match_parent并且父容器的mode为EXACTLY,那么子View的mode即为EXACTLY,子View大小为父容器剩余的大小

MeasureSpec.AT_MOST

父容器期望对子View的最大值做了限定

适用情况:
    c.子View的LayoutParams采用match_parent并且父容器的mode为AT_MOST,那么子View的mode即为AT_MOST,子View大小为父容器剩余的大小
    d.当子View的LayoutParams采用wrap_content时并且父容器的mode为EXACTLY或者AT_MOST时,子View的Mode就为AT_MOST,子View的specSize就为该父容器剩余的大小

MeasureSpec.UNSPECIFIED

父容器不限定大小,子View想多大就多大

适应情况:
    e.当子View的LayoutParams采用wrap_content时并且父容器的mode为UNSPECIFIED时,子View的Mode就为UNSPECIFIED,子View的大小不做限制

验证

如何证明我们上面的情况是正确的呢,那就是看源码!
我们看调用的流程:

onMeasure-->
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值