我已经看到很多在 android 中创建自定义视图和布局的示例。我从他们那里学到的是 measure(如 Android 开发者网站上所说)方法是onMeasure()
,它具有widthMeasureSpec
和heightMeasureSpec
作为参数。
- 这些参数的实际含义是什么?
- 它们的初始值是多少?
- 如果我创建的自定义视图是我的活动的父视图,它们会被调用什么值?
我对这些问题真的很困惑。
我已经看到很多在 android 中创建自定义视图和布局的示例。我从他们那里学到的是 measure(如 Android 开发者网站上所说)方法是onMeasure()
,它具有widthMeasureSpec
和heightMeasureSpec
作为参数。
我对这些问题真的很困惑。
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 模式中,用于传递您的视图及其子视图允许占用的最大允许空间。它还使用规范模式作为对子视图放置一些额外约束的一种方式,告知它们如何允许它们使用可用空间。
如何使用它的一个很好的例子是 Padding。ViewGroups 获取可用的宽度和高度,并减去它们的填充,然后创建一个新的 meassureSpec,从而将一个稍小的区域传递给它们的子级。
本文将对您有所帮助。我从文章的上下文中回答你的问题。
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. 如果我创建的自定义视图是我的活动的父视图,它们被称为什么值?
答: 这取决于您在父视图中给出的高度和宽度。您将在文章的最后一部分中对它有一个很好的了解,该部分还显示了我提到的下面的图表 -