自定义View绘制流程中的onMeasure()方法作用是对父布局进行测量,测量绘制控件所需要的空间大小,最后通过setMeasureDimension()设定绘制的实际大小。
在onMeasure()方法中传入了widthMeasureSpec和heightMeasureSpec,这两个参数包含了控件的大小和模式。我们只需要通过调用MeasureSpec的两个方法就可以获取到控件的大小和模式。
// 获取控件的模式
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
// 获取控件的尺寸
int wSize = MeasureSpec.getSize(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
其中MeasureSpec.getMode()获取到的结果一共有三种MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。
MeasureSpec.UNSPECIFIED 是未指定尺寸模式,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
MeasureSpec.AT_MOST 是最大尺寸模式,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
MeasureSpec.EXACTLY 是精确尺寸模式,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dp",或者为match_parent是,都是控件大小已经确定的情况,都是精确尺寸。