一:测量View的大小,以及测量方式和测量方法。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//获取最小的长宽量
final int minimumWidth = getSuggestedMinimumWidth();
final int minimumHeight = getSuggestedMinimumHeight();
// 根据XML定义和需求测量使用的数据
int viewWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
int viewHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
setMeasuredDimension(viewWidth, viewHeight);
}
二:根据测量值类MeasureSpec获取父控件测量子控件需要的值,根据需求来定义取值的大小,是取人为控制的大小还是测量的大小。
private int resolveMeasured(int measureSpec, int desired) {
int result = 0;
int specSize = MeasureSpec.getSize(measureSpec);
switch (MeasureSpec.getMode(measureSpec)) {
case MeasureSpec.UNSPECIFIED://未指定xml定义的wrap_content
result = desired;
break;
case MeasureSpec.AT_MOST://最大xml定义的match_parent
result = Math.max(specSize, desired);
break;
case MeasureSpec.EXACTLY://确切的数值(如100dp)
default:
result = specSize;
}
return result;
}
三:获取自定义控件的大小,通过onSizeChanged获取使用。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
final int width = w - getPaddingLeft() - getPaddingRight();
mSquareWidth = width / 3.0f;
final int height = h - getPaddingTop() - getPaddingBottom();
mSquareHeight = height / 3.0f;
}