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

我见过很多在android中创build自定义视图和布局的例子。 我从他们身上学到的是(在Android开发者的网站上说的)方法是onMeasure() ,它具有widthMeasureSpecheightMeasureSpec作为参数。

  1. 这些参数的实际含义是什么?
  2. 他们的初始价值是什么?
  3. 如果我正在创build的自定义视图是我的活动的父视图,他们将调用什么值?

我对这些问题感到非常困惑。

Solutions Collecting From Web of "Android自定义视图中的widthMeasureSpec和heightMeasureSpec是什么?"

widthMeasureSpecheightMeasureSpec是复合variables。 虽然它们只是普通的旧整数,但实际上包含了两个独立的数据。

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

你可以使用这种方便的方法提取这些数据:

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

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

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

你可以用这个方便的方法提取值:

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

您可以执行一些逻辑,更改其中的一个或两个,然后使用最后一个便捷方法创build新的meassureSpec:

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

并通过调用super.onMeasure( widthMeasureSpec, heightMeasureSpec );将其传递给您的孩子super.onMeasure( widthMeasureSpec, heightMeasureSpec );

onMeasure() ,MeasureSpec模式的作用是将允许的最大空间传递给您的视图,并且允许孩子占据。 它还使用spec模式作为在子视图上放置一些附加约束的一种方式,告知它们如何允许使用可用空间。

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