Android View内部类之MeasureSpec理解总结

 

MeasureSpec概念:

1、MeasureSpec 可以理解为测量规范,测量标准或者测量说明。表示父View传递给子View的布局要求和说明,封装了size和mode,包含了高度和宽度的size和mode。

2、MeasureSpec是View的一个内部类,MeasureSpec是一个32位 int 数值,它包含了两组信息。高两位代表SpecMode,低30位代表SpecSize,通过将SpecMode和SpecSize打包成一个int值来避免过多的对象内存分配,为了方便操作,其提供了打包和解包的方法。SpecMode和SpecSize也是一个int值,一组SpecMode和SpecSize可以打包为一个MeasureSpec,而一个MeasureSpec可以通过解包的形式来得出其原始的SpecMode和SpecSize。

MeasureSpec的值由specSize和specMode共同组成的,其中specSize(低30位)记录的是大小,specMode(高两位)记录的是规格。

一个View的测量过程是由父布局的MeasureSpec和其自身的LayoutParams决定的。

MeasureSpec 作用:

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

MeasureSpec常见三个方法:

static int getMode(int measureSpec) : 根据提供的测量格式,提取模式
static int getSize(int measureSpec) : 根据提供的测量格式,提取大小值
static int makeMeasureSpec(int size,int mode) : 根据提供的大小值和模式,创建一个测量格式
其中makeMeasureSpec()方法的作用将size 和 mode 打包成一个32位的int值,之所以这样做就是为了减少内存的分配。返回值为打包成的int类型值measureSpec 。 getMode 和 getSize 则是根据传入的int 类型值,解包成为 mode 和 size。

Mode 常见三种形式:

    1.EXACTLY:

当我们将控件的“layout_width”属性或者“layout_height”属性指定为具体数值时,比如“android:layout_width="200dp"”,或者指定为“match_parent”时,系统会使用这个模式。

    2. AT_MOST:

当控件的“layout_width”属性或者“layout_height”属性设置为“wrap_content”时,控件大小一般会随着内容的大小而变化,但是无论多大,也不能超过父控件的尺寸。

    3. UNSPECIFIED:

表示开发人员可以将视图按照自己的意愿设置成任意的大小,没有任何限制。这种情况比较少见,一般在绘制自定义View的时候才会用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值