2012-06-17 6 views
5

Obecnie pracuję nad tapetą na żywo, która jest bardzo intensywna i nie radzi sobie z obrotem ekranu.Rotacja ekranu na żywo tapety

W rzeczywistości tapeta jest zniszczona i wyświetla pusty ekran bez wywoływania funkcji SURfaceChanged!

Oto co mam w metodzie onSurfaceChanged:

@Override 
    public void onSurfaceChanged(SurfaceHolder holder, int format, 
      int width, int height) { 
     // TODO Auto-generated method stub 
     super.onSurfaceChanged(holder, format, width, height); 

     mRatio = (float) width/height; 
     if (mRatio > 1) { 
      orientation = 0; 
     } 
     if (mRatio < 1) { 
      orientation = 1; 
     } 
     setRunning(true); 
     Log.i(TAG, "Screen Rotation..."); 
     mHandle.post(r); 
    } 

Jestem przekonany, ta metoda nie sprawdzony, ponieważ nie ma wiadomości dziennika.

Dlaczego tak się dzieje i jakie są techniki obchodzenia obracania ekranu? Czy to możliwe, że moja tapeta na żywo jest tak intensywna, że ​​nie można nazwać pustki?

Również onVisibilityChanged nie nazywa się dobrze i podczas otwierania aplikacji na emulatorze, nie ma wiadomości dziennika:

@Override 
    public void onVisibilityChanged(boolean visible) { 
     // TODO Auto-generated method stub 
     super.onVisibilityChanged(visible); 
     if (visible) { 
      setRunning(true); 
      Log.i(TAG, "Visible..."); 
      mHandle.postDelayed(r, 2000); 
     } else { 
      setRunning(false); 
      Log.i(TAG, "Invisible..."); 
      mHandle.removeCallbacks(r); 
     } 
    } 
+0

Czy możesz dodać więcej kodu? Musisz wiedzieć, gdzie jest wykonywana cała ciężka praca. W mojej Live Wallpaper zarówno onSurfaceChanged, jak i onVisibilityChanged zostają wywołani podczas obracania ekranu. Sprawdź także LogCat pod kątem czegoś takiego jak "Czas oczekiwania na przesunięcie tapety" podczas zmiany orientacji. – Ole

Odpowiedz

1

w twojej manifest, oświadczam:

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

Twój onSurfaceChanged - Metoda może być wywołana tylko wtedy, gdy zadeklaruje się w manifeście rozmiar configChanges!

Odnośnie drugiego wydania: onVisibilityChanged nie jest to, czego można oczekiwać od nazwy:

Called when the window containing has change its visibility (between GONE, INVISIBLE, and VISIBLE). Note that this tells you whether or not your window is being made visible to the window manager; this does not tell you whether or not your window is obscured by other windows on the screen, even if it is itself visible.

Trzeba sprawdzić, czy aplikacja jest „widoczny” dla użytkownika poprzez onPause() i onResume()

+0

Dzięki za odpowiedzi, zmieniłem usługę żywo tapety do tego: - i to nie działa :( – Denizen

+0

Mój problem polega na tym, że im stale inicjalizuję 20 prostokątów i mam 40 lub więcej, jeśli instrukcje dla niwecząc ich. Instrukcje if są ciągle sprawdzane, nawet gdy im zrobię animację spowalniając działanie. – Denizen

+0

Powyższa odpowiedź nie dotyczy tapet na żywo, ale aplikacji wykorzystujących SurfaceView. Zatem ustawienie atrybutu configChanges nic nie da. Proszę pisać więcej kodu .. – Ole