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

以下は、onMeasure() の後で getWidth()/getHeight() に対してゼロを返すデバイス (Motorola Droid Razr Maxx) のログです。

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

また、手動で setMeasuredDimensions() を試みましたが、その手はログに影響しません。

ここで私が間違っていること、または 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 に答える