2012-06-17 4 views
5

Ich arbeite gerade an einem Live-Hintergrundbild, das sehr intensiv ist und die Bildschirmdrehung nicht gut beherrscht.Live Wallpaper Screen Rotation

In der Tat ist das Hintergrundbild zerstört und zeigt einen leeren Bildschirm ohne Aufruf von SurfaceChanged!

Hier ist, was ich in der onSurfaceChanged Methode haben:

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

Ich bin positiv diese Methode aufgerufen nicht, weil es keine Log-Nachricht ist.

Warum passiert das und welche Techniken gibt es für die Bildschirmdrehung? Könnte es sein, dass mein Live-Wallpaper so intensiv ist, dass die Lücke nicht aufgerufen werden kann?

Auch ist onVisibilityChanged nicht so gut genannt, und wenn ich apps auf dem Emulator öffnen, gibt es keine Log-Nachricht:

@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

ist Könnten Sie mehr Code posten? Ich muss wissen, wo all die schwere Arbeit gemacht wird. In meinem Live Wallpaper werden sowohl onSurfaceChanged als auch onVisibilityChanged während Bildschirmdrehungen aufgerufen. Überprüfen Sie außerdem, ob LogCat während der Änderung der Ausrichtung "Timeout wait for wallpaper to offset" anzeigt. – Ole

Antwort

1

In Ihrem Manifest erklären:

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

Ihre onSurfaceChanged - Methode sollte nur aufgerufen werden, wenn das configChanges -Attribut im Manifest deklariert wird!

Bezüglich Ihrer zweiten Frage: onVisibilityChanged ist nicht das, was man aus dem Namen erwarten würde:

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.

Sie müssen prüfen, ob Ihre Anwendung „sichtbar“ an den Benutzer über onPause() und onResume()

+0

Danke für die Antwort, änderte ich meine Live-Wallpaper-Service dazu: - und es funktioniert nicht :( – Denizen

+0

Mein Problem ist, dass ich ständig 20 Rechtecke initialisiere und 40 oder wenn if Aussagen für eine haben nimiere sie. Die if-Anweisungen werden ständig überprüft, auch wenn ich die Animation verlangsamte. – Denizen

+0

Die obige Antwort gilt nicht für Live-Hintergrundbilder, sondern für Anwendungen, die SurfaceView verwenden. Das Setzen des configChanges-Attributs wird also nichts bewirken. Bitte poste mehr Code .. – Ole

Verwandte Themen