我正在使用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()
回调吗?如果没有,我想我有两个选择:
ANativeWindow_setBuffersGeometry
(这实际上会给我旋转显示吗?)和/或eglCreateWindowSurface?那么我是否需要重新创建我的EGLContext(并重新加载我所有的OpenGL内容...... ick)?一般来说,"正确"是什么?关于ANativeWindow,EGLSurface和EGLContext处理方向变化的方法?