Android 自定义View measure模板

使用自定义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));
	}
	
}


你可能感兴趣的:(Android,android)