在渲染之前测量视图

nou*_*ine 56 android

我需要知道将视图附加到父视图后视图的大小.

我已经覆盖了这个方法:

onMeasure(int, int);
Run Code Online (Sandbox Code Playgroud)

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

addView(myView);
Run Code Online (Sandbox Code Playgroud)

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

任何人?

Dor*_*ori 86

如果你希望得到您的活动之前的宽度和高度已经把它添加到它的视图层次,测量和布置它,你将不得不调用measure()View调用之前自己getMeasuredWidth()getMeasuredHeight().

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

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

int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY);
Run Code Online (Sandbox Code Playgroud)

重点.(已在新API中更改) 上面传递的宽度可以是显式px或ViewGroup.LayoutParams.WRAP_CONTENTorViewGroup.LayoutParams.FILL_PARENT.

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

  • 您的重点是错误的,您不能将WRAP_CONTENT或FILL_PARENT作为makeMeasureSpec(int,int)的第一个参数传递.该值必须大于0或小于1073741823. (4认同)
  • 似乎这样的方法在IMPL 17改变了我将近5年前,回答了这个:) (3认同)

Pra*_*ast 7

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

这来自SDK文档:

第一对称为测量宽度和测量高度.这些维度定义了视图在其父级中的大小(有关更多详细信息,请参阅布局.)可以通过调用getMeasuredWidth()和getMeasuredHeight()来获取测量的维度.

第二对简称为宽度和高度,有时也称为绘图宽度和绘图高度.这些尺寸定义了屏幕上,绘图时和布局后视图的实际大小.这些值可以但不必与测量的宽度和高度不同.可以通过调用getWidth()和getHeight()来获得宽度和高度.

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


小智 5

第一个电话

 view.measure(0, 0);
Run Code Online (Sandbox Code Playgroud)

然后得到

view.getMeasuredWidth() 或者 view.getMeasuredHeight()


小智 0

您应该能够使用 getMesauredWith() 和 getMeasuredHeight()

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

  • 你必须先自己调用measure() - 请参阅我的答案 (12认同)