简单理解MeasureSpec

MeasureSpec在很大程度上决定了一个View的尺寸规格,因为父容器影响View的MeasureSpec的创建过程。在测量过程中,系统会将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpec,然后再根据这个MeasureSpec来测量出View的宽/高。

1.MeasureSpec

MeasureSpec代表一个32位int值,高2位代表SpecMode,低30位代表SpecSize,SpecMode是指测量模式,而specSize是指在某种测量模式下的规格大小。

MeasureSpec通过SpecMode和SpecSize打包成int值来避免过多对象内存分配,为了方便操作,其提供了打包和解包的方法。SpecModel和SpecSize也是一个int值,一组SpecMode和SpecSize可以打包为一个MeasureSpec,而一个MeasureSpec可以通过解包的形式来得出其原始的SpecMode和SpecSize,需要注意的是这里提到的MeasureSpec是指MeasureSpec所代表的int值,而并非MeasureSpec本身。

SPecMode有三类,每一类都表示特殊的含义,如下所示

1. UNSPECIFIED

父容器不对View有任何限制,要多大给多大,这种情况一般用于系统内部,表示一种测量的状态。

2. EXACTLY

父容器已经测量出View所需要的精确大小,这个时候View的最终大小就是SpecSize所指定的值。它对应于LayoutParams中的match_parent和具体的数值这两种模式。

3. AT_MOST

父容器指定了一个可用大小即SpecSize,View大小不能大于这个值,具体是什么值要看不同View的具体实现。它对应于LayoutParams中的Wrap_content

注:-1 代表的是EXACTLY,-2 是AT_MOST

PS:本文整理自以下文章,若有发现问题请致邮 [email protected]
《Android 开发艺术探索》

你可能感兴趣的:(简单理解MeasureSpec)