OnSurfaceCreated () se llama cambios de orientación cada vez

Estoy implementando el GLSurfaceView.Renderer así:

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

Esta clase se implementa en 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 es:

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

Muy simple como se puede ver. Cuando ahora comienzo la aplicación, el método onSurfaceCreated () se llama correctamente, sigue por una llamada de onSurfaceChanged ().

El problema ahora es: Siempre que cambie la orientación del dispositivo, recibo otra llamada de onSurfaceCreated () seguida de onSurfaceChanged () .

En mi entendimiento, el método onSurfaceCreated () se llama siempre que una nueva superficie necesita ser creada. Mi pregunta es: ¿Por qué hace eso cada vez que cambio sólo la orientación del dispositivo? ¿No debería ser suficiente que sólo se active una llamada onSurfaceChanged () para ajustar la ventana de visualización?

Tenga en cuenta que no pongo el dispositivo en suspenso al cambiar la orientación.

Haz esto

 <activity android:name=".MainActivity" android:configChanges="keyboardHidden|orientation|screenSize" /> 

La de las ventajas de OpenGL que se refiere al tamaño de la pantalla. Le da la capacidad de manejar todas las resoluciones de Android.

No estoy seguro de cómo funciona con GL20 (seguro de la misma como GL10).

Como sé en onSurfaceChanged proporciona varias configuraciones para OpenGL basadas en longitud / ancho de la pantalla.

Por ejemplo, glViewport

Es necesario llamar glViewport manejador glViewport cuando se modifican las dimensiones de vista GL .

Sólo si usted tiene width = height es innecesario, pero su otra historia.

Como ejemplo

 @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); 

Si desea evitarlo, agregue a Manifest.xml:

 <activity android:name="Activity" android:configChanges="screenSize|orientation"> 
  • Android: Problemas al calcular la orientación del dispositivo
  • Cómo obtener orientación del dispositivo Android
  • Ayuda natural de la orientación del sensor de Android
  • Descripción de la orientación del teléfono Android, incluida la brújula
  • Android SensorManager.java getOrientation y algoritmo getRotationMatrix
  • QML Canvas en Android, problema de orientación
  • Android no puede cargar la imagen orientada correcta desde la galería
  • Cuando cambio la orientación de retrato a paisaje mi resultado calculado está desapareciendo. Cómo resolverlo?
  • DialogFragment Orientación Cambiar el bloqueo con getActivity ()
  • Problema de Viewport en orientación normal móvil
  • Android: orientación manual de la pantalla sin reiniciar la actividad?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.