2011-12-23 13 views
5

Disclaimer: questo è uno strano problema che si verifica solo in un Kindle Fire (finora).Kindle Fire modifica la risoluzione dello schermo ad un certo punto ...

Tecnologie coinvolte: Android SDK, Eclipse, LibGDX.

Ho un'applicazione relativamente semplice in esecuzione con LibGDX. Il modo in cui funziona LibGDX consiste nell'avere un thread OpenGL che chiamerà Create() (una volta) e quindi Render() il maggior numero possibile di volte (in modo da poter eseguire il rendering ...).

Così, quando si inizializza il dispositivo, viene chiamato il metodo "Create()" e quindi quando la superficie OpenGL viene inizializzata (tutto ciò avviene automaticamente), il Render() inizia a essere richiamato.

Se il contesto OpenGL viene perso, distrutto, ecc. Il metodo Ridimensiona (larghezza, altezza) viene chiamato da LibGDX.

Finora. Così buono.

Ora mi sono imbattuto in uno strano problema con un Kindle Fire in cui le cose sembravano pochi pixel o "tagliati". Il Kindle Fire ha una "barra morbida" nella parte inferiore dello schermo (20 pixel) che non puoi nascondere o saltare, che è "tipo ok" perché il dispositivo non ha pulsanti fisici. Dovresti toccare questa barra morbida e ottenere una barra più grande per tornare indietro, tornare a casa, ecc. Secondo Amazon, questa barra non può essere rimossa. (non è chiaro al 100% ma nessuno ha trovato il modo di non infrangere le regole di Amazon). L'unica app che ho visto che rimuove è quella dei video player di Amazon per i video in streaming dal cloud di Amazon solo. Quindi, come puoi vedere, non sembra esserci un modo per "permanentemente" nascondere quella barra.

Quindi se la barra è lì, lo stato reale dello schermo non è la risoluzione hardware 1024x600 (orizzontale) ma 1024x580. Così ho aggiunto un po 'di registrazione per i miei metodi per vedere cosa stava succedendo, ed è stato sorpreso con questo ... (ricordate il Create(), render() e ridimensionare() metodi):

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 

Quindi lo schermo è stato "ridimensionato" dal Kindle Fire, "ad un certo punto".

Qualcuno si è imbattuto in qualcosa del genere?

Questo è uno screenshot (notare la barra nera in alto, che non è aggiunto da me!). Perdonami per aver offuscato l'immagine, ma questo è un progetto di un cliente e non posso "rivelare" nulla.

enter image description here

Il divertimento parte inizia quando volte, la barra non esserci e l'applicazione sarà simile al seguente (di nuovo, sry per la sfocatura). Si noti come la barra superiore non è lì ...

enter image description here

Dopo un esame più approfondito di entrambi i colpi, si può dire che il fondo (che dovrebbe essere lo stesso), non lo è. Il kindle sta facendo cose strane.

Qualche idea?

Gli asset erano originariamente imballati come 1024x600 ma lo abbiamo modificato (580 ora) e assumeremo che il viewport ora sia 1024x580 ma mi stavo chiedendo se qualcuno ha trovato un modo migliore per gestire queste sciocchezze?:)

note: we have android: theme = "@ android: style/Theme.NoTitleBar.Fullscreen" nel manifest. Non fa niente

Grazie in anticipo.

+1

Non riesco a risolvere il problema con Kindle, ma il metodo resize() può essere chiamato in qualsiasi momento e non è correlato a una perdita di contesto. La perdita del contesto è indicata da una chiamata a riprendere(). – badlogic

+0

@badlogic hi Mario;) (Gryzor qui). Sì, siamo in attesa del ridimensionamento() ma questo sembra essere un problema di Kindle Fire (riportato da altri). Amazon ha fatto qualcosa di brutto lì dentro ...: Grazie mille! –

risposta

6

fuoco Kindle ha uno strano comportamento, una volta che i carichi app sembra che "muove" schermo 20px up (altezza Softbar) quindi il tuo aspetto app qualche pixel spento o tagliato. Questo perché quando crei il tuo GLSurfaceView e imposta il tuo renderer chiama due volte al metodo onSurfaceChanged.

La prima volta, dopo che onSurfaceCreated viene chiamato, con un valore di risoluzione di 1024x600 e una seconda volta dopo la prima chiamata a onDrawFrame con un valore di 1024x580.

La soluzione, è necessario controllare le due chiamate su onSurfaceChanged e ridimensionare il viewport 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

Darei un'occhiata a questo, grazie. Quando riuscirò a farlo, ti farò sapere. –

+1

Spero che ti aiuti, sto usando quel codice per gestire questo problema nei miei progetti :) – gergonzalez

0

Corsi a questo problema di recente e si chiedeva se si era già trovato una soluzione.

La barra nera viene visualizzata perché l'app riporta l'altezza di 580 pixel. OpenGL ha un sistema di coordinate in cui (0,0) si trova nell'angolo in basso a sinistra dello schermo.

Per qualche motivo, la barra morbida di Kindle non sposta l'EGLSurface di 20 pixel verso l'alto. Ridimensiona tuttavia riduce le dimensioni di 20 px, lasciando la barra nera. Quindi il problema è la posizione di EGLSurface. E sembra che a volte, a causa dei tempi, il trasferimento avvenga dopo il ridimensionamento (facendo sparire la barra nera).

+0

La soluzione era quella di utilizzare la soluzione di cui sopra: http://stackoverflow.com/a/9225218/2684 –

Problemi correlati