我对MeasureSpec.UNSPECIFIED
和MeasureSpec.AT_MOST
感到有点困惑。
我知道,当match_parent
或常量维值设置为layout_width
或layout_height
时,{I}会在测量视图时应用MeasureSpec.EXACTLY
。
那么,MeasureSpec.UNSPECIFIED
和MeasureSpec.AT_MOST
怎么样?
我的理解是,当layout_width
或layout_height
设置为wrap_content
时,MeasureSpec.UNSPECIFIED
将被应用,因为wrap_content
表示高度或宽度视图可以是任何大小,具体取决于内容。但许多文章都说wrap_content
意味着MeasureSpec.AT_MOST
。所以我很困惑。我不知道何时应该使用MeasureSpec.AT_MOST
。
答案 0 :(得分:65)
视图大小的基本定义如下:
MeasureSpec.EXACTLY
- 视图应该是这么多像素,无论它实际上有多大。
MeasureSpec.AT_MOST
- 如果视图的尺寸较小,则视图可以是此尺寸或更小。
MeasureSpec.UNSPECIFIED
- 视图可以是它需要的任何大小,以显示它需要显示的内容。
MeasureSpec.AT_MOST
将应用于已设置为WRAP_CONTENT
的视图。例如,您的父视图可能绑定到屏幕大小。它的孩子也会受到这种规模的束缚,但它可能不会那么大。因此,父视图将MeasureSpec设置为AT_MOST
,它告诉孩子它可以是介于0和屏幕大小之间的任何位置。孩子必须做出调整,以确保它符合所提供的范围。
在特殊情况下,界限无关紧要。例如,ScrollView
。在ScrollView
的情况下,子视图的高度无关紧要。因此,它将为孩子提供UNSPECIFIED
视图,告诉孩子他们可以达到他们需要的高度。 ScrollView
将处理它们的绘图和放置。
答案 1 :(得分:0)
MeasureSpec封装了从父级传递给子级的布局要求。每个MeasureSpec代表宽度或高度的要求。 MeasureSpec由大小和模式组成。有三种可能的模式:
<强> UNSPECIFIED 强>
int
<强> EXACTLY 强>
The parent has not imposed any constraint on the child. It can be whatever size it wants.
<强> AT_MOST 强>
The parent has determined an exact size for the child. The child is going to be given those bounds regardless of how big it wants to be.
MeasureSpecs实现为int以减少对象分配。提供此类是为了将元组打包并解压缩到int
中答案 2 :(得分:0)
要获得完整的见解,请先查看 article。夏天是 -
当视图的宽度或高度为特定数字时,例如100px
或100dp
,无论测量模式如何,视图的spec模式都是EXACTLY
父容器,view的大小是具体的数字。
当view的宽度或高度采用MATCH_PARENT
时,view的spec模式与父容器的测量模式一致。但是 specSize 的值是不同的。当父容器的SpecSize为UNSPECIFIED
时,视图的specSize为0。当父容器的SpecSize为EXACTLY
或AT_MOST
时,视图的specSize的大小是父容器的剩余空间。
当视图的宽度或高度为WRAP_CONTENT
时,如果父容器的SpecMode为EXACTLY
或AT_MOST
,则视图的测量模式为AT_MOST
.当父容器的specMode为UNSPECIFIED
时,视图的测量模式为UNSPECIFIED
。视图的测量大小也受父容器测量模式的影响,特别是当父容器的specMode为UNSPECIFIED
时。当SpecMode为EXACTLY
或AT_MOST
时,视图specSize的最大大小不能超过父容器的剩余空间。当父容器的specMode为UNSPECIFIED
时,view的size为0。根据getChildMeasureSpec方法的逻辑,我们可以总结一下view和父容器的测量方式,view自身layoutParams的关系如下: