View的getHeight()和getWidth()方法返回值过大

9

我在自定义视图的onDraw()方法中调用getHeight()getWidth()。其中,getHeight()返回1,073,742,549getWidth()返回1,073,742,304。但是,当我查看屏幕高度和宽度的显示指标时,分别得到800和480。请问getHeight()getWidth()返回的是什么?

我获取视图的尺寸是为了选择放置于视图中的位图的尺寸。

谢谢。


我在Android方面是新手,但我有类似的经验。这可能与Android版本有关,因为同一项目在4.1上运行良好,但在2.3.6上却表现出奇怪的行为。也许缺少某些兼容性设置。 - user679156
你可能也在自定义视图中重写了onMeasure方法,并使用MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY)方法来调用setMeasuredDimensions。我相信你得到的值是由MeasureSpec.EXACTLY和你指定的尺寸一起返回的。 - John Bowers
4个回答

11

虽然它并没有明确解决你的问题,但有趣的是:

Width:
1,073,742,304 == 0x400001E0
          480 == 0x000001E0

Height:
1,073,742,549 == 0x400002D5
          725 == 0x000002D5

这个自定义视图是725 x 480吗?我不知道那个额外的0x40000000是从哪里来的,但是看起来除了1位以外几乎是正确的 :)


2
谢谢。这非常奇怪。所以我正在对宽度和高度进行0xbfffffff与操作,以获得正确的尺寸,这有效。 - Jays
2
@Jays,我再次查看了这个问题,我认为最安全的做法可能是 View.MeasureSpec.getSize(getWidth())(高度也是如此)。MeasureSpec 可以在顶部字符中发出其他信号,如果有什么变化,它可能会在以后咬你(比如如果它报告 0x8000xxxx)。 - Tim

5

3
也许,在您的自定义视图中做了类似于这样的事情。
final int desiredHSpec = MeasureSpec.makeMeasureSpec(pixelHeight, MeasureSpec.MODE_CONSTANT);
final int desiredWSpec = MeasureSpec.makeMeasureSpec(pixelWidth, MeasureSpec.MODE_CONSTANT);
setMeasuredDimension(desiredWSpec, desiredHSpec);

像这样 Android:为什么在自定义视图中重写onMeasure()后,视图的文本不能显示在RelativeLayout中?

如果你把它改成

setMeasuredDimension(width, height);

在onSizeChanged()和onLayout()方法中,您将获得简单的小宽度和高度。


0

我也遇到了这个问题。我解决的方法是重写onMeasure方法。这样视图始终具有相同的大小。例如,如果您希望视图具有屏幕的大小和宽度,则应执行以下操作:

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        WindowManager wm = (WindowManager)this.getContext().getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
//display.getWidth() and display.getHeight() return the screen dimensions
        this.setMeasuredDimension(display.getWidth(), display.getHeight());
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接