使用自定义View的时候,我们往往会重载onMeasure函数, 用多了之后,发现其实都是一套写法,因此记录下这个模板.
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
//计算宽
private int measureWidth(int measureSpec)
{
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if(mode == MeasureSpec.EXACTLY) //当指定了控件大小或者使用Match_Parent
{
result = size;
}else
{
//可以用下面的函数将dp转换成px
//float pxValue = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, getResources().getDisplayMetrics());
result = 100; // 单位是像素,这里写上自己计算的控件大小
if(mode == MeasureSpec.AT_MOST) //一般使用Wrap_Content会进入这个条件
{
result = Math.min(result, size);
}
}
return result;
}
//计算高
private int measureHeight(int measureSpec)
{
int result = 0;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);
if(mode == MeasureSpec.EXACTLY) //当指定了控件大小或者使用Match_Parent
{
result = size;
}else
{
//可以用下面的函数将dp转换成px
//float pxValue = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, getResources().getDisplayMetrics());
result = 100; // 单位是像素,这里写上自己计算的控件大小
if(mode == MeasureSpec.AT_MOST) //一般使用Wrap_Content会进入这个条件
{
result = Math.min(result, size);
}
}
return result;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}
}