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

Posted

技术标签:

【中文标题】getWidth() 和 getHeight 在 onMeasure() 之后返回零(特定设备)【英文标题】:getWidth() and getHeight return zero after onMeasure() (specific devices) 【发布时间】:2013-09-04 03:59:54 【问题描述】:

我注意到我的应用程序的视图在 onMeasure() 已经被调用之后为 getWidth() 和 getHeight() 返回了 0。这只发生在少数设备上,对于大多数 android 设备,以下代码可以正常工作。我的 checkViewAndLoad() 函数根据视图的大小加载缩放位图。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    Log.d("widthMeasureSpec", Integer.toString(MeasureSpec.getSize(widthMeasureSpec)));
    Log.d("heightMeasureSpec", Integer.toString(MeasureSpec.getSize(heightMeasureSpec)));
    Log.d("viewWidth", Integer.toString(getWidth()));
    Log.d("viewHeight", Integer.toString(getHeight()));

    checkViewAndLoad();

这是一个设备 (Motorola Droid Razr Maxx) 的日志,它在 onMeasure() 之后为 getWidth()/getHeight() 返回零:

09-03 20:55:58.359: D/widthMeasureSpec(29496): 540
09-03 20:55:58.359: D/heightMeasureSpec(29496): 720
09-03 20:55:58.359: D/viewWidth(29496): 0
09-03 20:55:58.359: D/viewHeight(29496): 0

我也尝试手动设置MeasuredDimensions(),但那只手对日志没有影响。

谁能告诉我我在这里做错了什么,或者在调用 onMeasure() 之后如何获取 SurfaceView 的宽度/高度?

【问题讨论】:

【参考方案1】:

在此处使用getMeasuredWidth/Height()getWidth/Height() 在布局之后才有效。

【讨论】:

/Height() 是什么意思 getMeasuredWidth() / getMeasuredHeight() 和 getWidth() / getHeight()。 我明白你的意思,但它看起来像除法,而且“在布局之后才有效。”没有意义,如果你愿意,我会编辑它。 史蒂夫,您的编辑没有区分绘图和布局,它们是不同的步骤。测量的 getter 在 measure() 之后有效,特别是 setMeasuredDimensions(),被调用,而普通的 getter 在 layout() 之后有效。绘图发生的频率比这两种方法中的任何一种都多,通常仅在某种大小更改或 requestLayout() 调用后才被调用。 这里有更多关于视图框架回调的信息:developer.android.com/reference/android/view/…【参考方案2】:

试试这个方法

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));

    Log.d("widthMeasureSpec", Integer.toString(MeasureSpec.getSize(widthMeasureSpec)));
    Log.d("heightMeasureSpec", Integer.toString(MeasureSpec.getSize(heightMeasureSpec)));
    Log.d("viewWidth", Integer.toString(getWidth()));
    Log.d("viewHeight", Integer.toString(getHeight()));

    if(getMeasuredWidth()!=0 && getMeasuredHeight()!=0)
              checkViewAndLoad();
    


【讨论】:

以上是关于getWidth() 和 getHeight 在 onMeasure() 之后返回零(特定设备)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

getWidth 和 getHeight 返回零

查看 getHeight 返回 1 但 getWidth 是正确的

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

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