37

我对MeasureSpec.UNSPECIFIED和有点困惑MeasureSpec.AT_MOST。我知道在测量视图时将应用match_parent或 恒定尺寸值设置为layout_width或。layout_heightMeasureSpec.EXACTLY

那么,MeasureSpec.UNSPECIFIEDMeasureSpec.AT_MOST呢?

我的理解是,当layout_widthlayout_height设置为时wrap_contentMeasureSpec.UNSPECIFIED将应用,因为wrap_content意味着视图的高度或宽度可以是任何大小,具体取决于内容。但很多文章都说是这个wrap_content意思MeasureSpec.AT_MOST。所以我很困惑。不知道什么时候MeasureSpec.AT_MOST申请。

4

3 回答 3

71

View 大小的基本定义如下:

MeasureSpec.EXACTLY- 一个视图应该正好有这么多像素,不管它实际上想要多大。

MeasureSpec.AT_MOST- 如果视图尺寸更小,则视图可以是这个尺寸或更小。

MeasureSpec.UNSPECIFIED- 一个视图可以是它需要的任何大小,以便显示它需要显示的内容。

MeasureSpec.AT_MOSTWRAP_CONTENT 如果父视图绑定了 size,则将应用于已设置为的视图。例如,您的父视图可能绑定到屏幕大小。它的孩子也会被绑定到这个大小,但它可能不会那么大。因此,父视图会将 MeasureSpec 设置为AT_MOST,它告诉子视图它可以在 0 和屏幕大小之间的任何位置。孩子必须进行调整以确保它符合所提供的范围。

在特殊情况下,界限无关紧要。例如,一个ScrollView. 在 a 的情况下ScrollView,子 View 的高度无关紧要。因此,它将UNSPECIFIED为孩子们提供一个 Views ,告诉孩子们他们可以达到他们需要的高度。ScrollView将为他们处理绘图和放置。

于 2013-04-15T19:09:54.663 回答
1

要获得完整的见解,请先查看文章。夏天是——

  1. 当视图的宽度或高度为特定数字时,例如100px100dp,视图的规格模式EXACTLY与父容器的测量模式无关,视图的大小为特定数字。

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

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

在此处输入图像描述

于 2021-02-11T18:27:25.533 回答
0

MeasureSpec 封装了从父级传递到子级的布局要求。每个 MeasureSpec 代表对宽度或高度的要求。MeasureSpec 由大小和模式组成。有三种可能的模式:

未指定

The parent has not imposed any constraint on the child. It can be whatever size it wants. 

确切地

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. 

最多

The child can be as large as it wants up to the specified size. 

MeasureSpecs 以整数形式实现以减少对象分配。提供此类以将元组打包和解包到 int

于 2017-10-07T04:12:33.417 回答