前言
之前在自定义控件的第二篇(点我)在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-->