这些天我正在学习如何在Android上自定义视图。我知道如果我们设置最小宽度,那么系统将比较我们设置的最小宽度和测量的宽度,并选择适合视图的正确宽度。令我困惑的是,android系统如何根据视图的内容改变视图的大小作为单词" wrap_content"我想了解更多有关如何实现" wrap_content"的详细信息。非常感谢。
答案 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
:父母用它来强加孩子的最大尺寸。孩子必须保证它及其所有后代都符合这个规模。