Android NDK - 处理方向更改

时间:2018-01-07 13:23:13

标签: android opengl-es android-ndk orientation

我正在使用Android NDK和OpenGLES创建游戏(而不是使用NativeActivity / native_app_glue)。

当用户旋转手机时,我不希望销毁并重新启动整个活动,因此我已将必要的部分添加到清单文件中:

android:configChanges="keyboardHidden|keyboard|orientation|screenSize"

按预期获得onConfigurationChanged()回调。我也得到一个surfaceRedrawNeeded()回调,这很好。

然而,我也希望获得surfaceChanged()回调,但这绝不会发生。

java代码如下所示:

public class MyActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        surface = new MySurface();
        getWindow().takeSurface(surface);

        view = new MyView(this);
        getWindow().setContentView(view);

        ... native setup
    }

    ...

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);

        ...
    }

    ...
}

class MyView extends View
{

    public MyView(Context context)
    {
        super(context);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) { ... }

    ... other input stuff
}

class MySurface implements SurfaceHolder.Callback2
{
    @Override
    public void surfaceCreated(SurfaceHolder holder) { ... }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { ... }

    @Override
    public void surfaceRedrawNeeded(SurfaceHolder holder) { ... }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) { ... }

    ...
}

问题:

  • 应该当方向发生变化时,我会在表面上获得surfaceChanged()回调吗?

如果没有,我想我有两个选择:

  1. 旋转相机并调整视口宽度/高度(不是我想要跟踪的内容)。
  2. 再次调用ANativeWindow_setBuffersGeometry(这实际上会给我旋转显示吗?)和/或eglCreateWindowSurface?那么我是否需要重新创建我的EGLContext(并重新加载我所有的OpenGL内容...... ick)?
  3. 一般来说,"正确"是什么?关于ANativeWindow,EGLSurface和EGLContext处理方向变化的方法?

0 个答案:

没有答案