在渲染之前测量一个视图
我需要找出多大的观点后,将其附加到它的父母。
我已经重写了这个方法:
onMeasure(int, int);
但它看起来像这个方法是只有当我真正添加我的自定义视图的容器使用:
addView(myView);
你认为在渲染视图之前有办法获取这些信息吗? 基本上我需要知道真正的大小,然后附加它,而不是附加视图,如果它会占用更多的一定的空间。
任何人?
如果要在活动将其添加到其视图层次结构之前获取宽度和高度,则必须在调用getMeasuredWidth()
或getMeasuredHeight()
之前自己调用View
上的getMeasuredHeight()
。
由于测量的宽度和高度是在度量被调用之后设置的(依次调用onMeasure()
),它们将在这个点之前返回0。 您将不得不提供MeasureSpec
来measure(..)
,这将根据您的需求而有所不同。
MeasureSpecs允许孩子自己施加任何限制
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY); int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY);
重要的一点 。 (已在新API中更改) 上面传递的宽度可以是显式px或 ViewGroup.LayoutParams.WRAP_CONTENT
或ViewGroup.LayoutParams.FILL_PARENT.
当您的视图在实际目标层次结构中进行测量时,值得注意的是,将传递给measure()
的MeasureSpec将根据包含的ViewGroups
布局逻辑进行configuration。 如果在这个父视图组/其自己的布局约束/任何同级子视图的约束条件下考虑时,可能会多次调用第一个度量值vals。 没有等待viewGroup
在实现任何依赖于测量大小的逻辑之前调用measure()
,从上面的解决scheme中得到最终的measuredWidth & height
将是困难的(取决于情况),但是在所有的情况下,我已经使用了上面的技术符合目的,但是它们比较简单。 如果你真的需要在上下文中测量,你应该在onLayout()
已经返回并且明确地设置了任何改变,然后requestLayout()
了。
OnMeasure不会告诉你视图的大小。 相反,它会要求您的自定义视图通过提供由父视图执行的一些约束来设置其大小。
这是来自SDK文档:
第一对称为测量宽度和测量高度。 这些维度定义了视图想要在其父代中有多大(请参阅布局了解更多详细信息。)可以通过调用getMeasuredWidth()和getMeasuredHeight()来获得测量的维度。
第二对简单地称为宽度和高度,或者有时绘制宽度和绘图高度。 这些尺寸定义了屏幕上的视图的实际尺寸,在绘制时间和布局之后。 这些值可能但不一定与测量的宽度和高度不同。 宽度和高度可以通过调用getWidth()和getHeight()来获得。
布局之后,可以调用getWidth()和getHeight()来查找自定义视图的最终大小。
你应该可以使用getMesauredWith()和getMeasuredHeight()
http://developer.android.com/reference/android/view/View.html#getMeasuredWidth%28%29
我有同样的问题。 我想唯一的办法是先渲染它,然后删除它后,如果它符合大小条件。 似乎有点奇怪的方式,但Android似乎只知道绘制后的尺寸。