Android进阶---自定义View:MeasureSpec的真正意义与View大小控制

本文详细探讨了Android中MeasureSpec的作用,它是父容器传递给子View的尺寸参考参数,包括UNSPECIFIED、EXACTLY和AT_MOST三种模式。通过分析`onMeasure`方法和`measureChild`函数,解释了如何根据MeasureSpec来确定自定义View的尺寸。同时,以FlowLayout为例,说明了ViewGroup如何根据MeasureSpec和子View尺寸来计算自身合理尺寸。
摘要由CSDN通过智能技术生成

android:layout_width=“match_parent”
android:layout_height=“match_parent”

那么按照我们的期望,希望子View的尺寸要是300dp*300dp,如果子View的布局参数是

android:layout_width=“100dp”
android:layout_height=“100dp”

按照我们的期望,希望子View的尺寸要是100dp*100dp,如果子View的布局参数是

android:layout_width=“wrap_content”
android:layout_height=“wrap_content”

按照我们的期望,希望子View的尺寸可以按照自己需求的尺寸来确定,但是最好不要超过300dp*300dp。

那么父容器怎么把这些要求告诉子View呢?MeasureSpec其实就是承担这种作用:MeasureSpec是父控件提供给子View的一个参数,作为设定自身大小参考,只是个参考,要多大,还是View自己说了算。先看下MeasureSpec的构成,MeasureSpec由size和mode组成,mode包括三种,UNSPECIFIED、EXACTLY、AT_MOST,size就是配合mode给出的参考尺寸,具体意义如下:

  • UNSPECIFIED(未指定),父控件对子控件不加任何束缚,子元素可以得到任意想要的大小,这种MeasureSpec一般是由父控件自身的特性决定的。比如ScrollView,它的子View可以随意设置大小,无论多高,都能滚动显示,这个时候,size一般就没什么意义。
  • EXACTLY(完全),父控件为子View指定确切大小,希望子View完全按照自己给定尺寸来处理,跟上面的场景1跟2比较相似,这时的MeasureSpec一般是父控件根据自身的MeasureSpec跟子View的布局参数来确定的。一般这种情况下size>0,有个确定值。
  • AT_MOST(至多),父控件为子元素指定最大参考尺寸,希望子View的尺寸不要超过这个尺寸,跟上面场景3比较相似。这种模式也是父控件根据自身的MeasureSpec跟子View的布局参数来确定的,一般是子View的布局参数采用wrap_content的时候。

先来看一下ViewGroup源码中measureChild怎么为子View构造MeasureSpec的:

protected void measureChild(View child, int parentWidthMeasureSpec,
int parentHeightMeasureSpec) {
final LayoutParams lp = child.getLayoutParams();

final int childWidthMeasureSpec = getChildMeas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值