我已经看到很多在android中创建自定义视图和布局的例子。我从他们那里学到的是,衡量标准(如Android开发人员网站上所述)是onMeasure()
,其中widthMeasureSpec
和heightMeasureSpec
为参数。
我对这些问题非常困惑。
答案 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 的父视图,它们的调用值是什么?
答案: 这将取决于您在父视图中给出的高度和宽度。您将在文章的最后一部分对此有一个很好的了解,其中还显示了我提到的下面的图表 -