gpt4 book ai didi

android - 将建议的宽度和高度设置为 android 中的自定义 View

转载 作者:行者123 更新时间:2023-11-29 23:24:51 25 4
gpt4 key购买 nike

我正在学习如何在 android 中创建自定义 View 。目前我不明白如何设置它的最小宽度和高度。为什么我认为它没有设置?因为我打印了 getSuggestedMinimumWidth() 的值,它向我返回了 0。

在 View 中,有一些图形淹没在 Canvas 上,这意味着在层次结构中它下面没有 View ,除非 View 是自动添加的(顺便说一句?)。

我尝试使用谷歌搜索为自定义 View 设置最小宽度或高度的可能方法,但没有找到任何东西。

那么,如何在 onMeasure() 方法中为自定义 View 设置最小宽度和高度?如果有一些问题,例如为什么需要覆盖该方法,那么答案是我想学习如何使用它。

最佳答案

测量自定义 View 实际上比看起来容易。你应该看看MeasureSpec .

您通常需要处理可以为您的 View 指定特定大小的情况,wrap_contentmatch_parent

onMeasure 被调用时,它被赋予 widthMeasureSpecheightMeasureSpec 参数,您可以将它们与 MeasureSpec 结合使用> 得到

  1. widthheight 模式
  2. 宽度高度 大小

模式可以是 MeasureSpec 中三个预定义值之一:

UNSPECIFIED

The parent has not imposed any constraint on the child. It can be whatever size it wants.

EXACTLY

The parent has determined an exact size for the child. The child is going to be given those bounds regardless of how big it wants to be.

AT_MOST

The child can be as large as it wants up to the specified size.

你需要做的是涵盖这些情况,~大部分~看起来像这样:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);

if (widthMode == MeasureSpec.EXACTLY) {
width = //Calculation
} else if (widthMode == MeasureSpec.AT_MOST) {
width = //Calculation
} else {
// UNSPECIFIED
width = //Calculation
}

if (heightMode == MeasureSpec.EXACTLY) {
height = //Calculation
} else if (heightMode == MeasureSpec.AT_MOST) {
height = //Calculation
} else {
// UNSPECIFIED
height = //Calculation
}

setMeasuredDimension(width, height);
}

如果您的自定义 View 是 ViewGroup 并且可以包含 1 个或多个 subview ,那么在某些情况下您应该测量 subview 。这是我几年前写的一段代码,用于测量自定义 ViewGroup 最多可以有 1 个 child ( mChild )并且需要通过以下方式计算其高度/宽度属性还认为它会在 child 周围画一个笔画(mStrokeWidth)。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);

measureChild(mChild, widthMeasureSpec, heightMeasureSpec);

int childWidth = mChild.getMeasuredWidth();
int childHeight = mChild.getMeasuredHeight();

if (widthMode == MeasureSpec.EXACTLY) {
width = MeasureSpec.getSize(widthMeasureSpec);
} else if (widthMode == MeasureSpec.AT_MOST) {
width = Math.min(width, (int) (childWidth + (mStrokeWidth * 2)));
}

if (heightMode == MeasureSpec.EXACTLY) {
height = MeasureSpec.getSize(heightMeasureSpec);
} else if (heightMode == MeasureSpec.AT_MOST) {
height = Math.min(height, (int) (childHeight + (mStrokeWidth * 2)));
}

setMeasuredDimension(width, height);
}

关于android - 将建议的宽度和高度设置为 android 中的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53758347/

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