42

我已经看到很多在 android 中创建自定义视图和布局的示例。我从他们那里学到的是 measure(如 Android 开发者网站上所说)方法是onMeasure(),它具有widthMeasureSpecheightMeasureSpec作为参数。

  1. 这些参数的实际含义是什么?
  2. 它们的初始值是多少?
  3. 如果我创建的自定义视图是我的活动的父视图,它们会被调用什么值?

我对这些问题真的很困惑。

4

2 回答 2

75

widthMeasureSpecheightMeasureSpec是复合变量。这意味着虽然它们只是普通的旧整数,但它们实际上包含两个独立的数据。

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

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

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 模式中,用于传递您的视图及其子视图允许占用的最大允许空间。它还使用规范模式作为对子视图放置一些额外约束的一种方式,告知它们如何允许它们使用可用空间。

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

于 2014-01-27T20:56:46.310 回答
1

本文将对您有所帮助。我从文章的上下文中回答你的问题。

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

回答:

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

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

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

回答:

when MODE_SHIFT= 30 当值是 -

MeasureSpec.UNSPECIFIED= 0<< MODE_SHIFT=0

MeasureSpec.EXACTLY= 1<< MODE_SHIFT=1073741824

MeasureSpec.AT_MOST= 2<< MODE_SHIFT=2147483648

3. 如果我创建的自定义视图是我的活动的父视图,它们被称为什么值?

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

在此处输入图像描述

于 2021-02-11T18:22:16.287 回答