在渲染之前测量视图

时间:2010-05-13 13:22:28

标签: android

在将视图附加到父视图后,我需要了解视图的大小。

我已经覆盖了这种方法:

onMeasure(int, int);

但看起来只有当我使用以下方法将自定义视图添加到其容器时才会调用此方法:

addView(myView);

您认为在渲染视图之前有没有办法获取此信息?基本上我需要在连接之前知道实际尺寸,如果占用更多的空间,则根本不附加视图。

5 个答案:

答案 0 :(得分:84)

如果您希望在活动将其添加到其视图层次结构之前获取宽度和高度,进行测量并将其布局,则必须先调用measure()上的View,然后再调用{{ 1}}或getMeasuredWidth()

由于测量的宽度和高度是在调整测量后设置的(后者调用getMeasuredHeight()),因此它们将在此点之前返回0。您必须提供onMeasure()MeasureSpec,这将根据您的需要而有所不同。

允许孩子们施加任何约束的MeasureSpecs看起来像

measure(..)

重点(已在新API中更改) 上面传递的宽度可以是显式px或int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY); int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY); ViewGroup.LayoutParams.WRAP_CONTENT

当您的视图在实际目标层次结构中进行衡量时,值得注意的是,将传递给ViewGroup.LayoutParams.FILL_PARENT.的MeasureSpec将根据包含measure()布局逻辑配置 。如果在此父视图组/其自己的布局约束/任何同级子视图的约束中考虑第一个度量值无效时,可能会多次调用它。在实现依赖于测量大小的任何逻辑之前,不等待ViewGroups调用viewGroup,从上述解决方案中获取最终measure()将很难(取决于具体情况),但是在我使用上述技术的所有情况下,它都符合目的,但它们相对简单。如果您确实需要在上下文中进行衡量,那么您应该在measuredWidth & height返回后执行此操作,然后再次明确设置所有更改onLayout()

答案 1 :(得分:7)

OnMeasure不会告诉您视图的大小。相反,它会要求您的自定义View通过提供父视图强制执行的某些约束来设置其大小。

这是来自SDK文档:

  

第一对被称为测量   宽度和测量高度。这些   维度定义视图的大小   在其父级内(请参阅布局   更多细节。)测量   尺寸可以通过调用获得   getMeasuredWidth()和   getMeasuredHeight()。

     

第二对简称为   宽度和高度,或有时绘图   宽度和绘图高度。这些   尺寸定义的实际尺寸   在绘图时屏幕上的视图   并在布局之后。这些值可能,   但不必,不同于   测量的宽度和高度。该   宽度和高度可以通过   调用getWidth()和getHeight()。

布局后,您可以调用getWidth()和getHeight()来查找自定义视图的最终大小。

答案 2 :(得分:1)

首次通话

false

然后得到

while view.measure(0, 0);

答案 3 :(得分:0)

你应该可以使用getMesauredWith()和getMeasuredHeight()

http://developer.android.com/reference/android/view/View.html#getMeasuredWidth%28%29

答案 4 :(得分:0)

我遇到了同样的问题。我想唯一的方法是首先渲染它,然后后删除它,如果它符合大小条件。看起来有点奇怪,但Android似乎只知道绘制后的尺寸。