gpt4 book ai didi

android - onMeasure 自定义 View 说明

转载 作者:IT老高 更新时间:2023-10-28 12:50:08 27 4
gpt4 key购买 nike

我尝试做自定义组件。我扩展了 View 类并在 onDraw 覆盖方法中进行了一些绘图。为什么我需要覆盖 onMeasure?如果我没有,一切看起来都是正确的。有人可以解释一下吗?我应该如何编写我的 onMeasure 方法?我看过几个教程,但每个教程都有点不同。有时他们在最后调用 super.onMeasure,有时他们使用 setMeasuredDimension 而没有调用它。区别在哪里?

毕竟我想使用几个完全相同的组件。我将这些组件添加到我的 XML 文件中,但我不知道它们应该有多大。我想稍后在自定义组件类中设置它的位置和大小(为什么我需要在 onMeasure 中设置大小,如果在我绘制它时在 onDraw 中也可以)。我到底什么时候需要这样做?

最佳答案

onMeasure() 是您告诉 Android 您希望自定义 View 有多大取决于父级提供的布局约束的机会;这也是您的自定义 View 了解这些布局约束的机会(如果您希望在 match_parent 情况下与 wrap_content 情况下的行为不同)。这些约束被打包到传递给方法的 MeasureSpec 值中。以下是众数值的粗略相关性:

  • EXACTLY 表示 layout_widthlayout_height 值已设置为特定值。你可能应该把你的 View 设为这个大小。这也可以在使用 match_parent 时触发,以将大小精确设置为父 View (这取决于框架中的布局)。
  • AT_MOST 通常意味着 layout_widthlayout_height 值设置为 match_parentwrap_content 需要最大尺寸的地方(这取决于框架中的布局),并且父尺寸的尺寸是值。你不应该比这个尺寸大。
  • UNSPECIFIED 通常意味着 layout_widthlayout_height 值设置为 wrap_content 没有任何限制。你可以是任何你想要的尺寸。一些布局还使用此回调来确定您想要的尺寸,然后再确定在第二次测量请求中实际再次传递给您的规范。

onMeasure() 存在的契约(Contract)是 setMeasuredDimension() 必须 在最后以您想要的大小调用认为是。所有框架实现都会调用此方法,包括 View 中的默认实现,这就是为什么在适合您的用例时调用 super 是安全的。

当然,因为框架确实应用了默认实现,所以您可能没有必要重写此方法,但如果您不这样做,则在 View 空间小于您的内容的情况下,您可能会看到剪辑,并且如果您使用 wrap_content 在两个方向上布置您的自定义 View ,您的 View 可能根本不会显示,因为框架不知道它有多大!

一般来说,如果您要覆盖 View 而不是另一个现有的小部件,那么提供一个实现可能是个好主意,即使它像这样简单:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int desiredWidth = 100;
int desiredHeight = 100;

int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);

int width;
int height;

//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}

//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}

//MUST CALL THIS
setMeasuredDimension(width, height);
}

希望有所帮助。

关于android - onMeasure 自定义 View 说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12266899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com