2011-12-23 18 views
5

Descargo de responsabilidad: este es un problema extraño que solo ocurre en un Kindle Fire (hasta ahora).Kindle Fire cambia resolución de pantalla en algún momento ...

Tecnologías implicadas: Android SDK, Eclipse, LibGDX.

Tengo una aplicación relativamente simple ejecutándose con LibGDX. La forma en que funciona LibGDX es tener un hilo de OpenGL que llamará a Create() (una vez) y luego a Render() tantas veces como sea posible (para que pueda hacer su render ...).

Así que cuando inicializa el Dispositivo, se invoca su método "Crear()" y luego, cuando se inicializa la superficie OpenGL (todo esto sucede automágicamente), su Render() comienza a recibir llamadas.

Si el contexto de OpenGL se pierde, se destruye, etc. LibGDX llama al método de Redimensionar (ancho, alto).

Hasta ahora. Tan bueno.

Ahora me encontré con un problema extraño con un Kindle Fire donde las cosas se veían unos pocos píxeles apagados o "cortados". El Kindle Fire tiene una "barra de software" en la parte inferior de la pantalla (20 píxeles) que no se puede ocultar u omitir, lo que es "bueno" porque el dispositivo no tiene botones físicos. Se espera que toques esta barra suave y obtengas una barra más grande para volver, ir a casa, etc. Según Amazon, esta barra no se puede quitar. (No está 100% claro, pero nadie ha encontrado una manera, eso no está rompiendo las reglas de Amazon). La única aplicación que he visto que elimina es Amazon Reproductores de video para videos que se transmiten desde la nube de Amazon solo. Como puede ver, no parece haber una forma de ocultar "permanentemente" esa barra.

Por lo tanto, si la barra está allí, su estado de pantalla real no es la resolución de hardware 1024x600 (horizontal) sino 1024x580. Por lo que añade un poco de la tala a mis métodos para ver lo que estaba pasando, y se sorprendió con esta ... (recordemos el create(), render() y cambiar el tamaño() métodos):

12-23 15:17:04.119: I/myapp(19921): SCREEN HEIGHT AT CREATE(): 600 
[snip other unrelated log stuff] 
12-23 15:17:04.673: I/myapp(19921): SCREEN HEIGHT AT RENDER() LOOP: 600 
[snip other unrelated log stuff] 
12-23 15:17:04.705: I/myapp(19921): MyApp - Resize() Called. 
12-23 15:17:04.705: I/myapp(19921): SCREEN HEIGHT AT RENDER() LOOP: 580 

así que la pantalla ha sido "redimensionado" por Kindle Fire, "en algún momento".

¿Alguien ha encontrado algo como esto?

Esta es una captura de pantalla (observe la barra negra en la parte superior, eso no es agregado por mí). Perdóname por difuminar la imagen, pero este es un proyecto del cliente y no puedo "revelar" nada.

enter image description here

La diversión comienza cuando parte veces, la barra no estar allí y la aplicación se verá como la siguiente (de nuevo, sry para la falta de definición). Observe cómo la barra superior no está allí ...

enter image description here

Tras un examen más detenido de los dos disparos, se puede decir que la parte inferior (que debe ser el mismo), no lo es. El kindle está haciendo cosas extrañas.

¿Alguna idea?

Los activos se embalaron originalmente como 1024x600, pero hemos cambiado eso (580 ahora) y asumiremos que la ventana gráfica ahora es 1024x580, pero me preguntaba si alguien encontró una mejor manera de lidiar con esta tontería.:)

nota: tenemos android: theme = "@ android: estilo/Theme.NoTitleBar.Fullscreen" en el manifiesto. No hace nada.

Gracias de antemano.

+1

No puedo ayudar con el problema de Kindle en sí, pero el método resize() se puede llamar en cualquier momento y no está relacionado con una pérdida de contexto. La pérdida de contexto se indica mediante una llamada a resume(). – badlogic

+0

@badlogic hi Mario;) (Gryzor aquí). Sí, estamos pendientes de cambiar el tamaño() pero parece ser un problema de Kindle Fire (informado por otros). Amazon hizo algo desagradable allí ...: S gracias a ' –

Respuesta

6

fuego Kindle tiene un comportamiento extraño, una vez que las cargas de aplicaciones parece que "mueve" 20px pantalla hacia arriba (altura softbar), por tanto, su apariencia de aplicaciones unos pocos píxeles apagados o cortados. Esto se debe a que cuando crea su GLSurfaceView y configura su renderer llama dos veces al método onSurfaceChanged.

Primera vez, después de llamar a onSurfaceCreated, con un valor de resolución de 1024x600 y una segunda vez después de la primera llamada a onDrawFrame con un valor de 1024x580.

La solución, debe controlar las dos llamadas a onSurfaceChanged y cambiar el tamaño de la ventana de OpenGL.

private static boolean appStarted = false; 
    ... 

    private static class Renderer implements GLSurfaceView.Renderer 
    { 
     public void onSurfaceChanged(GL10 gl, int width, int height) 
     { 
      if (!appStarted) 
      { 
       //Initialization (Resolution 1024x600) 
      } 
      else 
      { 
       //Second call, screen resolution changed (Resolution 1024x580) 
       //Resize(width,height) 
      } 
      appStarted = true; 
     } 

     public void onDrawFrame(GL10 gl) { 
     //Render() 
     } 

     public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     //Create() 
     } 
    } 
+0

Voy a echar un vistazo a esto, gracias. Cuando logre hacerlo, te lo haré saber. –

+1

Espero que te ayude, estoy usando ese código para gestionar este problema en mis proyectos :) – gergonzalez

0

Corrí a este problema recientemente y se preguntaba si ya había encontrado una solución.

Aparece la barra negra porque su aplicación informa que la altura es de 580 píxeles de alto. OpenGL tiene un sistema de coordenadas en el que (0,0) se encuentra en la esquina inferior izquierda de la pantalla.

Por alguna razón, la barra suave del Kindle no mueve la superficie EGLS en 20 píxeles. Sin embargo, el cambio de tamaño reduce el tamaño en 20 píxeles, dejando la barra negra. Entonces, el problema es la ubicación de EGLSurface. Y parece que, en ocasiones, debido a la sincronización, la reubicación ocurre después del cambio de tamaño (haciendo que la barra negra desaparezca).

+0

La solución fue utilizar la solución anterior: http://stackoverflow.com/a/9225218/2684 –

Cuestiones relacionadas