自定义View之 onMeasure() view的高度自适应wrap_content view的测量

读群英传有感,笔记之。。。。。。

在很多自定义view之后,控件的高度需要自适应,即使使用wrap_content没有作用还是match_parent的效果,这时就需要重写onMeasure()方法来实现,view类的onMeasure()方法默认是只支持.EXACTLY模式,所以在自定义view先支持wrap_content就得重写onMeasure(),在这里就需要说一下测量的三种模式了:

第一种:

EXACTCLY

大概意思就是精确值模式,我们在布局文件中的宽和高为具体值,或为match_parent(父布局的大小)属性时系统会用次模式,

第二种:

AT_MOST

大概意思就是最大值模式,我理解为就是自适应。我们在布局文件中的宽和高为wrap_content 属性时,控件的大小一般会随着子View大小大或内容的多少的变化而变化,此控件只要不超过父控件的大小就行。

第三种:

UNSPECIFIED

这种模式不指定测量模式,view大小没有限制,想多大就多大。

我们可以通过MeasureSpec这个类的getMode()和getSize()方法获取测量模式和大小,

代码如下:

没什么逻辑,仔细看一下就ok了

/**
	 * view的大小控制
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

		setMeasuredDimension(measureWidth(widthMeasureSpec),
				measureHeight(heightMeasureSpec));

	}

	private int measureHeight(int measureSpec) {
		int result = 0;
		int mode = MeasureSpec.getMode(measureSpec);
		int size = MeasureSpec.getSize(measureSpec);

		if (mode == MeasureSpec.EXACTLY) {
			result = size;
		} else {
			result=75;
			if (mode == MeasureSpec.AT_MOST) {
				result = Math.min(result, size);
			}
		}
		return result;

	}

	private int measureWidth(int measureSpec) {
		int result = 0;
		int mode = MeasureSpec.getMode(measureSpec);
		int size = MeasureSpec.getSize(measureSpec);

		if (mode == MeasureSpec.EXACTLY) {
			result = size;
		} else {
			result = 75;//根据自己的需要更改
			if (mode == MeasureSpec.AT_MOST) {
				result = Math.min(result, size);
			}
		}
		return result;

	}



哪有不足之处请大家指出,共同进步。。。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当父布局的高度属性为 `wrap_content` 时,自定义 View高度是根其内容动态确定的,无法直接获取准确的高度值。但可以通过以下方法来获取自定义 View 的准确高度: 1. 使用 ViewTreeObserver 监听布局完成事件:在自定义 View 的代码中,可以使用 `ViewTreeObserver` 来监听布局完成事件,一旦布局完成,就可以获取到自定义 View 的准确高度。示例代码如下: ```java ViewTreeObserver vto = customView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { customView.getViewTreeObserver().removeOnGlobalLayoutListener(this); int height = customView.getHeight(); // 获取自定义 View高度 // 在这里可以使用获取到的高度进行后续操作 } }); ``` 2. 重写 `onMeasure()` 方法:在自定义 View 的代码中,可以重写 `onMeasure()` 方法,在测量过程中获取到准确的高度值,并保存起来供后续使用。示例代码如下: ```java @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); // 在这里可以获取到准确的宽度和高度,并保存起来 } ``` 通过以上方法,你可以在父布局为 `wrap_content` 的情况下获取到自定义 View 的准确高度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值