Android 自定义View measure模板

本文详细解析了自定义View时如何重载onMeasure函数进行宽高计算,包括不同尺寸约束下的处理逻辑及单位转换方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值