0

次のような変数を持つ GLRendering クラスがあります。

public class MyGLRenderer implements GLSurfaceView.Renderer{

int width;

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {

//I know these values are being set here correctly here to the devices width and height
//Confirmed using Logging

this.width = width;
this.height = height;


}


}

私のActivityクラスでは、GLSurfaceViewクラスのインスタンスを作成し、次のようにオブジェクトを介して幅の値を取得しようとしています:

public class MainActivity extends Activity {

private GLSurfaceView myView;
MyGLRenderer render;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Request full screen

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN);

    myView = new MyGLSurfaceView(this);
    render = new MyGLRenderer(myView);

    setContentView(myView);
}

Activity クラスに内部クラスがあり、次のように、この「幅」変数にアクセスする必要があるのは、このクラスの onTouchEvent() メソッドからです。

class MyGLSurfaceView extends GLSurfaceView {

    @Override
    public boolean onTouchEvent(MotionEvent event) {

Log.v("Testing","Value of width is: "+render.width)

onTouchEvent() メソッドから値をログアウトすると、0 が返されます。なぜですか? 私はそれが0ではなく、実際にはデバイスの画面の幅であることを知っています。

MyGLSurfaceView クラスの 'width' 変数の宣言をstaticに変更すると正常に動作しますが、Activity クラスで MyGLSurfaceView クラスのインスタンスを作成する理由は、静的を使用したくないためです。static を使わずにアクセスしたい。

getter メソッドも試してみましたが、同じ結果が得られました。

誰かがこの動作とそれを回避する方法を理解するのを手伝ってくれませんか? ありがとう

4

1 に答える 1

1

コメントから移動:

width プロパティにアクセスするときにゼロになる可能性は 2 つだけです。1. 前にコメントに書いたように: 間違ったインスタンスにアクセスしている、または 2. プロパティが実際にゼロです。そのため、コードにログを追加してください。レンダラー クラスの構築と width プロパティの変更をログに記録します。それは問題を見つけるのに役立つはずです。一意の UUID をレンダラーに追加してログに記録できるため、ログ エントリがどのインスタンスからのものかを常に把握できます。

于 2013-05-07T19:58:07.097 に答える