6

我注意到我的应用程序视图在 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

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

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

4

2 回答 2

10

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

于 2013-09-04T04:12:46.677 回答
1

试试这种方式

@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();
    }

}
于 2013-09-04T04:20:56.567 回答