Android如何实现属性" wrap_content"?

时间:2016-02-27 14:04:55

标签: android view

这些天我正在学习如何在Android上自定义视图。我知道如果我们设置最小宽度,那么系统将比较我们设置的最小宽度和测量的宽度,并选择适合视图的正确宽度。令我困惑的是,android系统如何根据视图的内容改变视图的大小作为单词" wrap_content"我想了解更多有关如何实现" wrap_content"的详细信息。非常感谢。

1 个答案:

答案 0 :(得分:0)

这是Official Documentation所说的内容(我只是为了快速阅读而添加了一部分内容)

当View对象的measure()方法返回时,必须设置其getMeasuredWidth()getMeasuredHeight()值以及所有View对象后代的值。 View对象的测量宽度和测量高度值必须遵守View对象父母施加的约束。这保证了在测量通过结束时,所有父母都接受他们孩子的所有测量。父视图可能会对其子项不止一次调用measure()。例如,父母可以使用未指定的维度测量每个孩子一次,以找出他们想要的大小,然后如果所有孩子的无限制大小的总和是,则用实际数字再次对他们进行measure()太大或太小(也就是说,如果孩子们不同意他们每人得到多少空间,家长会介入并在第二次通过时制定规则。)

度量过程使用两个类来传达维度。 View对象使用ViewGroup.LayoutParams类来告诉他们的父母他们想要如何测量和定位。基础ViewGroup.LayoutParams类只描述了View对宽度和高度的要求。对于每个维度,它可以指定以下之一:

MATCH_PARENT,这意味着View希望与其父级一样大(减去填充)

WRAP_CONTENT,这意味着View想要足够大以包含其内容(加上填充)。

MeasureSpec个对象用于将需求从父级推送到子级。 MeasureSpec可以采用以下三种模式之一:

UNSPECIFIED:父级使用它来确定子视图的所需维度。例如,LinearLayout可以在其子级上调用measure(),其高度设置为UNSPECIFIED,宽度为EXACTLY 240,以查找子视图希望的高度给定宽度为240像素。

EXACTLY:父母用它来强加孩子的确切大小。孩子必须使用这个尺码,并保证它的所有后代都符合这个尺寸。

AT MOST:父母用它来强加孩子的最大尺寸。孩子必须保证它及其所有后代都符合这个规模。