什么时候应用MeasureSpec.UNSPECIFIED和MeasureSpec.AT_MOST?

时间:2013-04-15 19:01:00

标签: android

我对MeasureSpec.UNSPECIFIEDMeasureSpec.AT_MOST感到有点困惑。 我知道,当match_parent或常量维值设置为layout_widthlayout_height时,{I}会在测量视图时应用MeasureSpec.EXACTLY

那么,MeasureSpec.UNSPECIFIEDMeasureSpec.AT_MOST怎么样?

我的理解是,当layout_widthlayout_height设置为wrap_content时,MeasureSpec.UNSPECIFIED将被应用,因为wrap_content表示高度或宽度视图可以是任何大小,具体取决于内容。但许多文章都说wrap_content意味着MeasureSpec.AT_MOST。所以我很困惑。我不知道何时应该使用MeasureSpec.AT_MOST

3 个答案:

答案 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。夏天是 -

  1. 当视图的宽度或高度为特定数字时,例如100px100dp,无论测量模式如何,视图的spec模式都是EXACTLY父容器,view的大小是具体的数字。

  2. 当view的宽度或高度采用MATCH_PARENT时,view的spec模式与父容器的测量模式一致。但是 specSize 的值是不同的。当父容器的SpecSize为UNSPECIFIED时,视图的specSize为0。当父容器的SpecSize为EXACTLYAT_MOST时,视图的specSize的大小是父容器的剩余空间。

  3. 当视图的宽度或高度为WRAP_CONTENT时,如果父容器的SpecMode为EXACTLYAT_MOST,则视图的测量模式为AT_MOST .当父容器的specMode为UNSPECIFIED时,视图的测量模式为UNSPECIFIED。视图的测量大小也受父容器测量模式的影响,特别是当父容器的specMode为UNSPECIFIED时。当SpecMode为EXACTLYAT_MOST时,视图specSize的最大大小不能超过父容器的剩余空间。当父容器的specMode为UNSPECIFIED时,view的size为0。根据getChildMeasureSpec方法的逻辑,我们可以总结一下view和父容器的测量方式,view自身layoutParams的关系如下:

enter image description here