Android verfügt über eine Reihe von Personalisierungsfunktionen, mit denen Benutzer viele Aspekte der Benutzererfahrung ihrer Geräte anpassen können. Eine dieser Funktionen ist Live-Wallpaper. Das Live Wallpaper bleibt nicht als statisches Hintergrundbild erhalten, sondern verfügt über interaktive Funktionen. In diesem Lernprogramm erfahren Sie, wie Sie ein Live-Hintergrundbild erstellen!
Ein Live-Hintergrundbild unter Android wird normalerweise als Hintergrundbild auf dem Startbildschirm verwendet, der sich im Laufe der Zeit auf irgendeine Weise animiert oder ändert. Wenn Sie über ein Android-Gerät verfügen, haben Sie wahrscheinlich bereits ein paar integrierte Live-Wallpaper gesehen, wie z. B. das, bei dem Blätter in plätscherndes Wasser fallen.
Als Entwickler können Sie Live-Hintergrundbilder erstellen und veröffentlichen. Der Prozess ist nicht besonders schwierig. Das Erstellen eines Live-Hintergrundbilds, das faszinierend und wünschenswert ist, ohne die Batterie des Benutzergeräts zu erschöpfen, ist jedoch eine Herausforderung. In diesem Lernprogramm führen wir Sie durch den Prozess der Erstellung eines Live-Hintergrundbilds, das sich verhält. :)
Vor kurzem haben wir Ihnen gezeigt, wie Sie RenderScript verwenden. Das Endergebnis dieses Tutorials war ein einfacher Schneefall. Lassen Sie uns diesen Effekt in ein Live-Hintergrundbild verwandeln.
Der Open Source-Code für dieses Lernprogramm steht zum Download zur Verfügung. Wir empfehlen, es zu verwenden, um es zu folgen. Die Codeauflistungen in diesem Lernprogramm enthalten nicht den gesamten Inhalt jeder Datei und nicht die Projekteinrichtung oder den Code, der in vorherigen Lernprogrammen beschrieben wurde.
Man könnte sagen, dass ein Live-Wallpaper nur eine Dienstleistung ist. Um ein Live-Hintergrundbild zu erstellen, erweitern Sie einfach die WallpaperService-Klasse und implementieren eine einzige Methode, die häufig nur eine einzige Codezeile enthält, und fügen dann Ihre Service-Definition zur Manifest-Datei hinzu.
Mal sehen, wie das aussieht. Hier ist der WallpaperService:
öffentliche Klasse FallingSnowWallpaperService erweitert WallpaperService @Override public Engine onCreateEngine () return new FallingSnowWallpaperEngine ();
Und du bist fertig! Okay, nicht wirklich. Der Großteil der Arbeit eines Live-Wallpaper erfolgt in einer WallpaperService.Engine-Implementierung. Hier können Sie auf Rückrufe wie onSurfaceChanged () und onSurfaceCreated () reagieren. Klingt bekannt? Diese ähneln sehr den Rückrufen, die Sie möglicherweise beim Implementieren eines View- oder eines anderen oberflächenbasierten Objekts gesehen haben.
Und jetzt wird die Realität der Live-Wallpaper sichtbar: Wenn Sie die WallpaperService.Engine implementieren, zeichnen Sie nur auf eine bereitgestellte Oberfläche (über einen SurfaceHolder). Es ist fast so einfach. Bevor wir zur Implementierung von WallpaperService.Engine gelangen, betrachten wir einige der anderen Konfigurationsaspekte.
Da ein Live-Hintergrundbild ein Dienst ist, müssen Sie den Dienst in Ihrer Manifestdatei registrieren. Die Dienstregistrierung könnte ungefähr so aussehen:
Hier gibt es ein paar Dinge zu beachten. Für die Verwendung dieses Dienstes ist zunächst die Berechtigung BIND_WALLPAPER erforderlich (d. H. Eine andere Anwendung, die dieses Hintergrundbild verwendet, würde die Berechtigung BIND_WALLPAPER als Verwendungsberechtigungseintrag in ihrem Manifest erfordern. Zweitens ist der Intent-Filter eine Zeichenfolge ähnlich der Basisklasse. Schließlich zeigen die Metadaten auf eine XML-Datei. Diese vom Entwickler definierte XML-Datei enthält einige zusätzliche Hintergrundkonfigurationen. Hier ist unsere XML-Datei für die Live-Hintergrundeinstellungen namens fallingsnow_wp:
Hier verwenden wir einfach das Symbol für den normalen Start als Miniaturansicht und zeigen auf eine Zeichenfolge, die als Beschreibung in der Liste der Hintergrundbilder angezeigt wird. Wenn Ihr Live-Hintergrund konfiguriert werden muss, zeigen Sie mit der Eigenschaft android: settingsActivity darauf.
Vergessen Sie schließlich nicht, in Ihrer Manifestdatei die Verwendungsfunktion für android.software.live_wallpaper festzulegen:
Jetzt, wo das langweilige, aber kritische Zeug aus dem Weg ist, kehren wir zur eigentlichen Arbeit zurück: Erstellen der WallpaperService.Engine-Klasse. Da wir bereits eine RenderScript-Datei für Animationen haben, müssen wir nur noch das Rendering mit der neuen Oberfläche verknüpfen. Die onSurfaceCreated () - Methode von Engine ist ein großartiger Ort, um das RenderScriptGL-Objekt zu erstellen, das wir benötigen:
@Override public void onSurfaceCreated (SurfaceHolder-Inhaber) super.onSurfaceCreated (Inhaber); RenderScriptGL.SurfaceConfig surfaceConfig = new RenderScriptGL.SurfaceConfig (); mRenderScriptGL = new RenderScriptGL (FallingSnowWallpaperService.this, surfaceConfig); // use low für wallpapers mRenderScriptGL.setPriority (RenderScript.Priority.LOW);
Wir haben auch die Rendering-Priorität auf niedrig gesetzt - dies ist ein Live-Hintergrund und kein kritisches Spiel oder eine UI-Rendering-Engine. Es sollte nichts anderes auf dem System verlangsamen.
Bereinigen Sie dies in der onSurfaceDestroyed () -Methode:
@Override public void onSurfaceDestroyed (SurfaceHolder-Inhaber) super.onSurfaceDestroyed (Inhaber); if (mSnowRS! = null) mSnowRS.stop (); mSnowRS = null; if (mRenderScriptGL! = null) mRenderScriptGL.destroy (); mRenderScriptGL = null;
Die onSurfaceChanged () - Methode ist ein hervorragender Ort zum Initialisieren der RenderScript-Klasse. Dies ist der erste Ort, an dem Sie Details über das, was Sie rendern möchten, wie beispielsweise Breite und Höhe, herausfinden. Hier legen wir auch die Oberfläche für die RenderScriptGL-Klasse fest.
@Override public void onSurfaceChanged (SurfaceHolder-Halter, int-Format, Int-Breite, Int-Höhe) super.onSurfaceChanged (Halter, Format, Breite, Höhe); if (mRenderScriptGL! = null) mRenderScriptGL.setSurface (Halter, Breite, Höhe); if (mSnowRS == null) mSnowRS = new SnowRS (Breite, Höhe); mSnowRS.init (mRenderScriptGL, getResources (), isPreview ()); mSnowRS.start ();
Es empfiehlt sich, das Hintergrundbild anzuhalten, wenn es nicht sichtbar ist.
@Override public void onVisibilityChanged (boolean visible) super.onVisibilityChanged (visible); if (mSnowRS == null) if (sichtbar) mSnowRS.start (); else mSnowRS.stop ();
Und das ist es. Das Live Wallpaper rollt. Oder animiert. Oder macht, was immer Sie wollen.
Möchten Sie auf Abgriffe reagieren? Überschreiben Sie die onCommand () -Methode der WallpaperService.Engine-Klasse.
Möchten Sie die Positionen anpassen, wenn der Benutzer zwischen den Startseiten wechselt? Überschreiben Sie die onOffsetsChanged () - Methode der WallpaperService.Engine-Klasse.
Möchten Sie wissen, ob der Benutzer die Vorschau betrachtet, bevor Sie das Hintergrundbild festlegen? Rufen Sie die isPreview () -Methode der WallpaperService.Engine-Klasse auf und überprüfen Sie die Ergebnisse.
Die vollständige Implementierung unserer WallpaperService.Engine-Klasse finden Sie in FallSnowWallpaperService.java des Open Source-Projekts.
Schauen wir uns das Live-Hintergrundbild an:
Das sollte bekannt aussehen; Es ist dasselbe, was wir in der RenderScript-Aktivität gesehen haben.
Das Live Wallpaper ist ein großartiger Ort, um hocheffiziente grafische Effekte zu erzielen. Sie müssen jedoch feststellen, dass der Benutzer nicht zwangsläufig da sitzt und eine Demo schaut (wissen Sie, wie die von scene.org). Dies bedeutet, dass Sie möglicherweise die Framerate reduzieren, die Pixelanzahl, die Anzahl der Polygone oder Texturdetails reduzieren müssen, um das Hintergrundbild interessant zu halten, aber CPU, GPU und Akku nicht belasten. Wenn Benutzer feststellen, dass Ihr Live-Hintergrundbild den Akku verbraucht, wird Ihre App schlecht dargestellt und das Gerät erscheint schwach und die Akkulaufzeit ist gering. Eine schlechte Erfahrung mit einem Android-Gerät führt dazu, dass alle Entwickler einen schlechten Ruf erleiden.
Die Demo-Ansicht und -Aktivität (aus dem vorherigen Lernprogramm) ist beim Start der App weiterhin verfügbar. Statt es zu entfernen, fügen Sie einfach einen Handler hinzu. Wenn ein Benutzer darauf klickt, werden die Live-Hintergrundeinstellungen angezeigt, sodass der Benutzer das Live-Hintergrundbild auswählen kann?
public void onWallpaperSettings (Ansicht anzeigen) Intent wallpaperSettings = new Intent (Intent.ACTION_SET_WALLPAPER); startActivity (wallpaperSettings);
Warum eigentlich nicht! Das war einfach. Fügen Sie in jeder anklickbaren Ansicht einfach die Eigenschaft android: onClick = "onWallpaperSettings" hinzu, und schon kann es losgehen.
Hier ist ein Standbild:
Live-Wallpaper sind eine bequeme Möglichkeit, Ihre Anwendung über ihre typischen Grenzen hinaus zu erweitern. Hast du ein Rollenspiel? Machen Sie ein paar nette Live-Wallpaper mit den Hauptfiguren. Stellen Sie nur sicher, dass Sie beim Rendern auf dem Bildschirm den gesunden Menschenverstand verwenden, damit die Benutzererfahrung mit ihrem Gerät nicht darunter leidet.
Teilen Sie uns mit, welche coolen Live-Wallpaper Sie in den Kommentaren erstellen!
Die mobilen Entwickler Lauren Darcey und Shane Conder haben mehrere Bücher zur Android-Entwicklung mitgeschrieben: ein ausführliches Programmierbuch mit dem Titel Android Wireless-Anwendungsentwicklung und Sams Teach Yourself Android-Anwendungsentwicklung in 24 Stunden. Wenn sie nicht schreiben, verbringen sie ihre Zeit damit, mobile Software in ihrem Unternehmen zu entwickeln und Beratungsdienste anzubieten. Sie können sie per E-Mail an [email protected], über ihren Blog unter androidbook.blogspot.com und über Twitter @androidwireless erreichen.