2013-12-12 12 views
5

Ich entwickle mit Nexus 4 KitKat 4.4 und versuchen, IMMERSIVE MODE zu meinem Spiel hinzuzufügen. Ich brauche Bildschirmhöhe, um glViewport richtig einzustellen. ZuvorAndroid, GL, Bildschirmgröße in IMMERSIVE-Modus

benutzte ich

@SuppressWarnings("deprecation") 
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
public static int getScreenHeight() { 
    if (Main.m_activity == null) 
     return -1; 
    Display display = Main.m_activity.getWindowManager() 
      .getDefaultDisplay(); 
    int height = -1; 

    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB){ 
     //width = display.getWidth(); // deprecated 
     height = display.getHeight(); // deprecated 
    }else{ 
     Point size = new Point(); 
     display.getSize(size); 
     height = size.y; 
    } 
    return height; 

} 

Es ist nicht die wirkliche Höhe des Bildschirms in IMMERSIVE MODE zurückzukehren.

Also begann ich von Werten zu verwenden

private static class Renderer implements GLSurfaceView.Renderer { 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 

und es funktionierte gut, wenn app beginnt. Wenn ich nach Hause Taste drücken und zurück zum Startbildschirm und dann zurück zum Spiel onSurfaceChanged wieder aufgerufen, aber mit alten falschen Werten (nicht eintauchend Modus Bildschirmgröße, kleine, regelmäßige)

IMMERSIVE Bildschirmgröße 800x1280 REGULAR Größe 800x1184 ist

Wenn ich normale Größe bekomme und setze es in glViewport dann bekomme ich schwarze Linie oben auf dem Bildschirm.

PS Auch IMMERSIVE MODE geht verloren, wenn ich die Lautstärketasten drücke.

PS2

Ich habe folgende Methode Impl. Es hilft nicht bei der Bildschirm-/Fenster-Größenanpassung.

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
+0

@payeli, bitte unterlassen Sie unnötige "Verbesserung" Tags. Wir haben bereits zwei * -Tags für Kitkat, wir brauchten kein drittes. – Charles

Antwort

3

Guter Artikel, aber immer noch nicht genug. http://developer.android.com/training/system-ui/immersive.html

Gerade jetzt bekommen wir Bildschirmgröße mit

public void onSurfaceChanged(GL10 gl, int width, int height) { 

und wenn Höhe verringert dann ermöglichen wir immersiven Modus wieder mit 1 Sekunde Verzögerung. Das funktioniert aber hacky und ich suche selbst nach kanonischen Lösung.

Ich fürchte, es ist nur Buggy in KitKat. Ich habe keinen berühmten Titel, der Immersive-Modus implementiert. (außer unserer App natürlich)))

+0

Ich mag solche verzögerten Anrufe im Allgemeinen nicht. – Max

4

Verwenden Display.getRealSize die Bildschirm Grenzen ohne Systemfenster zurück.

+0

Wenn ich das tue, dann wenn ich die Lautstärketaste drücke, geht der immersive Modus verloren. Display.getRealSize gibt weiterhin die Bildschirmgröße an. – Max

3

Sie können View.OnSystemUiVisibilityChangeListener verwenden, um einen Rückruf zu erhalten, wenn der Immersive-Modus deaktiviert/aktiviert ist. Mit diesem können Sie die tatsächliche Höhe des Bildschirms herausfinden.

+0

Funktioniert es, wenn der Benutzer die Gerätelautstärke mit Hardwaretasten ändert und der Dialog über der App erscheint? Wenn der Benutzer nach dem Öffnen der Immersive-App als Erstes die Lautstärke mit den Hardwaretasten ändert, wird die App-Sichtbarkeit in meinen Tests nicht geändert. – mmathieum