查看 getHeight() 和 getWidth() 返回值太大

Posted

技术标签:

【中文标题】查看 getHeight() 和 getWidth() 返回值太大【英文标题】:View getHeight() and getWidth() return values too large 【发布时间】:2012-04-09 23:33:07 【问题描述】:

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

我正在获取视图的尺寸,因此我可以选择将在视图中显示的位图的尺寸。

谢谢。

【问题讨论】:

我是 android 新手,但我也有类似的经历。它与 Android 版本有关,因为同一个项目在 4.1 上运行良好,但在 2.3.6 上出现这种奇怪的行为,可能缺少一些兼容性设置。 您是否也在自定义视图中覆盖 onMeasure 并使用 MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY) 的值调用 setMeasuredDimensions。我相信你得到的值会从 makeMeasureSpec 返回,带有 MeasureSpec.EXACTLY 和你指定的尺寸。 【参考方案1】:

没有明确解决你的问题,但奇怪的是:

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

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

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

【讨论】:

谢谢。这很奇怪。因此,我将宽度和高度与 0xbfffffff 进行比较,以获得正确的尺寸,这是可行的。 @Jays,我又看了一遍,我认为最安全的做法可能是View.MeasureSpec.getSize(getWidth())(还有身高)。 measurespec 可以指示该顶部字符内的其他内容,如果某些内容发生变化,它可能会在以后咬你(比如它报告 0x8000xxxx)。【参考方案2】:

getHeight()getWidth() 返回以像素为单位的大小,请参阅 http://developer.android.com/reference/android/view/View.html#getHeight%28%29

额外的大小可能来自View.MeasureSpec 常量EXACTLY 参见http://developer.android.com/reference/android/view/View.MeasureSpec.html#getSize%28int%29

【讨论】:

【参考方案3】:

也许,您在自定义视图中做了类似的事情。

final int desiredHSpec = MeasureSpec.makeMeasureSpec(pixelHeight, MeasureSpec.MODE_CONSTANT);
final int desiredWSpec = MeasureSpec.makeMeasureSpec(pixelWidth, MeasureSpec.MODE_CONSTANT);
setMeasuredDimension(desiredWSpec, desiredHSpec);

喜欢这个Android:Why after override onMeasure() in a custom view, the view's text can't show in RalativeLayout?

如果你改成

setMeasuredDimension(width, height);

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

【讨论】:

【参考方案4】:

我也有这个问题。我解决它的方法是覆盖 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());
    

【讨论】:

以上是关于查看 getHeight() 和 getWidth() 返回值太大的主要内容,如果未能解决你的问题,请参考以下文章

getWidth 和 getHeight 返回零

getWidth() 和 getHeight 在 onMeasure() 之后返回零(特定设备)

自定义视图的getWidth()和getHeight()给出错误的值[重复]

为啥我无法访问面板的 getWidth() 和 getHeight() 函数?

Bitmap通过getWidth和getHeight获取尺寸不符

bitmap.getWidth()或bitmap.getHeight()的单位是多少