onmeasure方法里的参数说明以及用width和height中所需要注意的事项

本文介绍了自定义View中onmeasure方法的作用,解释了MeasureSpec的三种模式:UNSPECIFIED、EXACTLY和AT_MOST。强调在设置尺寸时需使用setMeasuredDimension方法,并指出在onmeasure方法之后才能安全地使用width和height。文中还提供了两种解决运行时获取尺寸的方法:使用全局布局监听器或手动调用measure方法。

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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   int measureWidth = MeasureSpec.getSize(widthMeasureSpec);
   setMeasuredDimension(measureWidth, (int) (measureWidth * 6F / 7F) / count);

}

这个是比较常见的onmeasure方法下确定view宽和高的方法,它的参数是由父布局传递给子布局的,

一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。

一个MeasureSpec由大小和模式组成。它有三种模式:UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,

子元素可以得到任意想要的大小;EXACTLY(完全),父元素决定自元素的确切大小,

子元素将被限定在给定的边界里而忽略它本身大小;AT_MOST(至多),子元素至多达到指定大小的值。

通过getsize()方法拿到尺寸,通过setMeasuredDimension方法进行设置。

注:在我们自定义view时,常常会拿到父布局view的尺寸,而在运行时,布局需要经过onmeasure,onlayout,ondraw方法后才会显示,在onmeasure方法执行

后才能使用width和height,不然会出现运行错误。通常这种情况有两种解决方法:

1⃣️view.getViewTreeObserver().addOnGlobalLayoutListener(new OnOnGlobalLayoutListener(){

@override

public void onGlobalLayout(){

view.getViewTreeObserver().removeGlobalLayoutListener(this);

view.getChildAt(1).getLeft() - view.getChildAt(0).getLeft();

}

});

2⃣️view.measure(0,0);

view.getMeasuredHeight();这样也能拿到测量之后的高度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值