Android自定义视图中的widthMeasureSpec和heightMeasureSpec是什么?

时间:2013-01-24 04:01:04

标签: android

我已经看到很多在android中创建自定义视图和布局的例子。我从他们那里学到的是,衡量标准(如Android开发人员网站上所述)是onMeasure(),其中widthMeasureSpecheightMeasureSpec为参数。

  1. 这些参数的实际含义是什么?
  2. 他们的初始值是什么?
  3. 如果我创建的自定义视图是我的活动的父视图,那么它们被调用的值是什么?
  4. 我对这些问题非常困惑。

2 个答案:

答案 0 :(得分:50)

widthMeasureSpec heightMeasureSpec 是复合变量。它们只是简单的旧的含义,它们实际上包含两个独立的数据。

存储在这些变量中的数据的第一部分是给定维度的可用空间(以像素为单位)。

您可以使用以下便捷方法提取此数据:

int widthPixels = View.MeasureSpec.getSize( widthMeasureSpec );

第二条数据是测量模式,它存储在int的高位中,并且是这些可能值之一:

View.MeasureSpec.UNSPECIFIED
View.MeasureSpec.AT_MOST
View.MeasureSpec.EXACTLY

您可以使用这种便捷方法提取值:

int widthMode = View.MeasureSpec.getMode( widthMeasureSpec );

你可以做一些逻辑,改变其中一个或两个,然后使用最后的方便方法创建一个新的meassureSpec:

int newWidthSpec = View.MeasureSpec.makeMeasureSpec( widthPixels, widthMode  );

通过致电super.onMeasure( widthMeasureSpec, heightMeasureSpec );

,将其传递给您的孩子

onMeasure()中,MeasureSpec模式用于传递视图允许的最大空间,并允许其子节点占用。它还使用spec模式作为在子视图上放置一些额外约束的方法,告知它们如何允许它们使用可用空间。

如何使用它的一个很好的例子是Padding。 ViewGroups获取可用的宽度和高度,并减去它们的填充,然后创建一个新的meassureSpec,从而将一个稍小的区域传递给他们的孩子。

答案 1 :(得分:0)

这个article会对您有所帮助。我正在从文章的上下文中回答您的问题。

1.这些参数的实际含义是什么?

答案:

widthMeasureSpec 父视图强加给子视图的水平空间要求。

heightMeasureSpec 父视图强加给子视图的垂直空间要求

2.它们的初始值是多少?

答案:

MODE_SHIFT = 30 当值是 -

MeasureSpec.UNSPECIFIED = 0 << MODE_SHIFT = 0

MeasureSpec.EXACTLY = 1 << MODE_SHIFT = 1073741824

MeasureSpec.AT_MOST = 2 << MODE_SHIFT = 2147483648

3.如果我创建的自定义视图是我的 Activity 的父视图,它们的调用值是什么?

答案: 这将取决于您在父视图中给出的高度和宽度。您将在文章的最后一部分对此有一个很好的了解,其中还显示了我提到的下面的图表 -

enter image description here