3.2View的测量
三种模式:
1.EXACTLY:设置了layout_weight和layout_height的具体值(layout_weight="100dp"或者layout_weight=match_parent)
2.AT_MOST:设置layout_weight和layout_height为warp_conten
3.UNSPECIFIED:想多大多大,绘制自定义view。
模式1,view类中onMeasure默认。自定义view,需要绘制2-3的模式,则需要重写onMeasure函数。
来找个原声widget看看它是如何重写的。ActionBarView.java这个比较标准,来看一下:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final LayoutParams upLp = (LayoutParams) mUpView.getLayoutParams();
... ...
int width = mUpView.getVisibility() == GONE ? 0 : mStartOffset;
int height = upLp.topMargin + mUpView.getMeasuredHeight() + upLp.bottomMargin;
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
switch (widthMode) {
case MeasureSpec.AT_MOST:
width = Math.min(width, widthSize);
break;
case MeasureSpec.EXACTLY:
width = widthSize;
break;
case MeasureSpec.UNSPECIFIED:
default:
break;
}
switch (heightMode) {
case MeasureSpec.AT_MOST:
height = Math.min(height, heightSize);
break;
case MeasureSpec.EXACTLY:
height = heightSize;
break;
case MeasureSpec.UNSPECIFIED:
default:
break;
}
setMeasuredDimension(width, height);
}