gpt4 book ai didi

android - 覆盖onMeasure()的权威方法?

转载 作者:IT老高 更新时间:2023-10-28 13:07:56 24 4
gpt4 key购买 nike

覆盖 onMeasure() 的正确方法是什么?我见过各种方法。例如,Professional Android Development 使用 MeasureSpec 来计算尺寸,然后以调用 setMeasuredDimension() 结束。例如:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
this.setMeasuredDimension(parentWidth/2, parentHeight);
}

另一方面,根据 this post ,“正确”的方法是使用 MeasureSpec,调用 setMeasuredDimensions(),接着调用 setLayoutParams(),最后调用 super.onMeasure()。例如:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
this.setMeasuredDimension(parentWidth/2, parentHeight);
this.setLayoutParams(new *ParentLayoutType*.LayoutParams(parentWidth/2,parentHeight));
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

那么正确的方法是什么?这两种方法对我来说都不是 100% 有效的。

我想我真正要问的是有人知道解释 onMeasure()、布局、 subview 尺寸等的教程吗?

最佳答案

其他解决方案并不全面。它们可能在某些情况下有效,并且是一个很好的起点,但它们可能无法保证有效。

当调用 onMeasure 时,您可能有权也可能无权更改尺寸。传递给 onMeasure 的值(widthMeasureSpecheightMeasureSpec)包含有关允许您的 subview 执行的操作的信息。目前有三个值:

  1. MeasureSpec.UNSPECIFIED - 你可以随心所欲
  2. MeasureSpec.AT_MOST - 随心所欲(达到规范尺寸),在您的示例中为 parentWidth
  3. MeasureSpec.EXACTLY - 别无选择。家长已选择。

这样做是为了让 Android 可以多次通过以找到每个项目的正确尺寸,请参阅 here了解更多详情。

如果您不遵守这些规则,则无法保证您的方法有效。

例如,如果您想检查是否允许更改大小,您可以执行以下操作:

final int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
final int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
boolean resizeWidth = widthSpecMode != MeasureSpec.EXACTLY;
boolean resizeHeight = heightSpecMode != MeasureSpec.EXACTLY;

使用此信息,您将知道是否可以修改代码中的值。或者,如果您需要做一些不同的事情。解决所需大小的一种快速简便的方法是使用以下方法之一:

int resolveSizeAndState (int size, int measureSpec, int childMeasuredState)

int resolveSize (int size, int measureSpec)

虽然第一个仅适用于 Honeycomb,但第二个适用于所有版本。

注意:您可能会发现 resizeWidthresizeHeight 始终为 false。如果我请求 MATCH_PARENT,我发现情况就是这样。我可以通过在我的父布局上请求 WRAP_CONTENT 来解决这个问题,然后在 UNSPECIFIED 阶段请求 Integer.MAX_VALUE 的大小。这样做会给你 parent 在下一次通过 onMeasure 时允许的最大尺寸。

关于android - 覆盖onMeasure()的权威方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423082/

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