4

私はGLSurfaceView.Rendererを次のように実装しています:

public class GL20Renderer implements GLSurfaceView.Renderer {
    private static GL20Renderer mInstance = new GL20Renderer();
    private GL20Renderer() {}
    public static GL20Renderer getInstance() {
        return mInstance;
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        Log.e("App", "onDrawFrame()");
    }
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Log.e("App", "onSurfaceChanged()");
    }
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Log.e("App", "onSurfaceCreated()");
    }

}

このクラスは MainActivity に実装されています。

public class MainActivity extends Activity {
    private GLSurfaceView mGLView;

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

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

        // Create a GLSurfaceView instance and set it as the ContentView for this Activity
        mGLView = new GL20SurfaceView(this);
        setContentView(mGLView);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mGLView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mGLView.onResume();
    }

}

GL20SurfaceView は:

public class GL20SurfaceView extends GLSurfaceView {
    public GL20SurfaceView(Context context) {
        super(context);

        // Create an OpenGL ES 2.0 context.
        setEGLContextClientVersion(2);

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(GL20Renderer.getInstance());
    }
}

ご覧のとおり非常にシンプルです。アプリを起動すると、onSurfaceCreated() メソッドが正しく呼び出され、続いて onSurfaceChanged() が 1 回呼び出されます。

問題は次のとおりです。デバイスの向きが変わるたびに、onSurfaceCreated() の別の呼び出しに続いて onSurfaceChanged() が呼び出されます。

私の理解では、新しいサーフェスを作成する必要があるときはいつでも onSurfaceCreated() メソッドが呼び出されます。私の質問は、デバイスの向きだけを変更するたびになぜそうするのですか? ビューポートを調整するには、onSurfaceChanged() 呼び出しをトリガーするだけで十分ではないでしょうか?

向きを変更するときにデバイスをスリープ状態にしないことに注意してください。

4

2 に答える 2

4

こうすれば

<activity
            android:name=".MainActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            />
于 2013-09-28T13:02:35.003 に答える
1

画面サイズを考慮して描画するOpenGLの利点の1つ。これにより、すべての Android 解像度を処理できます。

それがどのように機能するかはわかりませんGL20(GL10と同じです)。

私が知っているonSurfaceChangedように、画面の長さ/幅に基づいてOpenGLのいくつかの構成を提供します。

例えばglViewport

ビューの寸法が変更されたglViewportときにハンドラを呼び出す必要があります。GL

幅 = 高さがある場合のみ不要ですが、別の話です。

例として

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

    // prevent 0 divide
    if(height == 0) {
        height=1;
    }

    screenWidth = width;
    screenHeight = height;
    ratio = (float) width/height;
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrthof(0, width, 0, height, -10f, 10f);
    gl.glViewport(0, 0, screenWidth, screenHeight);

それを避けたい場合は、Manifest.xml に以下を追加してください。

<activity android:name="Activity"
  android:configChanges="screenSize|orientation">
于 2013-09-28T13:02:38.823 に答える