Android View getHeight()和getWidth()返回值太大

Android View getHeight()和getWidth()返回值太大,android,view,viewlayout,Android,View,Viewlayout,我在onDraw()方法的自定义视图中调用getHeight和getWidthgetHeight()返回1073742549和getWidth()返回1073742304。然而,当我查看屏幕高度和宽度的显示指标时,我分别得到800和480。getHeight和getWidth返回的是什么 我正在获取视图的尺寸,这样我就可以选择将进入视图的位图的尺寸 谢谢。getHeight()和getWidth()返回以像素为单位的大小,请参阅 额外的大小可能来自视图。MeasureSpecconstant确切

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

我正在获取视图的尺寸,这样我就可以选择将进入视图的位图的尺寸

谢谢。

getHeight()
getWidth()
返回以像素为单位的大小,请参阅


额外的大小可能来自
视图。MeasureSpec
constant
确切地说
请参见

并没有明确地解决您的问题,但奇怪的是:

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

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

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

也许,您在自定义视图中做了类似的操作

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

如果你把它换成

setMeasuredDimension(width, height);

,您将在onSizeChanged()和onLayout()上获得简单的小宽度、高度。我也有这个问题。我解决它的方法是覆盖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());
    }

谢谢真奇怪。因此,我将宽度和高度与0xbfffffff进行比较,以获得正确的尺寸,这是可行的。@Jays,我再次查看了这一点,我认为最安全的做法可能是
View.MeasureSpec.getSize(getWidth())
(还有高度)。measurespec可以在这个最上面的字符中发出其他信号,如果有什么变化,它可能会在以后咬你(比如如果它报告0x8000xxxx)。我是Android新手,但我有类似的经验。它与Android版本有关,因为同一个项目在4.1上运行良好,但在2.3.6上有这种奇怪的行为,可能缺少一些兼容性设置。您是否也可以在自定义视图中覆盖onMeasure,并使用MeasureSpec.makeMeasureSpec(width,MeasureSpec.justice)的值调用setMeasuredDimensions。我相信,您得到的值将从makeMeasureSpec返回,并使用MeasureSpec.精确地返回您指定的维度。