Live achtergronden maken op Android

Android heeft een aantal personalisatiefuncties waarmee gebruikers veel aspecten van de gebruikerservaring van hun apparaat kunnen aanpassen. Een van deze functies is live wallpaper. Live achtergronden blijven niet als statische achtergrondafbeeldingen, maar hebben in plaats daarvan interactieve functies. Leer hoe je een live wallpaper maakt in deze tutorial!

Een live wallpaper op Android wordt normaal gesproken gebruikt als achtergrond op het startscherm die op een of andere manier animeert of verandert. Als je een Android-apparaat hebt, heb je waarschijnlijk een paar van de ingebouwde live achtergronden gezien, zoals die waar bladeren in rimpelend water lijken te vallen.

Als ontwikkelaar kunt u live achtergronden maken en publiceren. Het proces is niet bijzonder moeilijk. Het is echter een uitdaging om een ​​live wallpaper te maken die fascinerend en wenselijk is zonder de batterij van het apparaat leeg te maken. In deze zelfstudie leiden we je door het proces van het maken van een live wallpaper die zich gedraagt. :)


Stap 0: Aan de slag

Onlangs hebben we laten zien hoe u RenderScript kunt gebruiken. Het eindresultaat van die tutorial was een eenvoudig sneeuwvallend effect. Laten we dat effect veranderen in een live wallpaper.

De open source-code voor deze zelfstudie is beschikbaar om te downloaden. We raden aan deze te gebruiken om mee te gaan. De codevermeldingen in deze zelfstudie bevatten niet de volledige inhoud van elk bestand en hebben geen betrekking op de projectinstellingen of code die in eerdere zelfstudies zijn behandeld.


Stap 1: Service of motor?

Je zou kunnen zeggen dat een live wallpaper slechts een service is. Immers, om een ​​live wallpaper te maken, trek je eenvoudigweg uit van de WallpaperService-klasse en implementeer je een enkele methode, vaak met slechts één regel code, en dan voeg je je servicedefinitie toe aan het manifest-bestand.

Laten we kijken hoe dit eruit ziet. Dit is de WallpaperService:

 public class FallingSnowWallpaperService breidt WallpaperService uit @Override public Engine onCreateEngine () return new FallingSnowWallpaperEngine (); 

En je bent klaar! Oké, niet echt. Het grootste deel van het werk van een live wallpaper vindt plaats in een WallpaperService.Engine-implementatie. Hier kunt u reageren op callbacks, zoals onSurfaceChanged () en onSurfaceCreated (). Klinkt bekend? Deze lijken erg op de callbacks die u mogelijk hebt gezien bij het implementeren van een weergave of een ander object op basis van Surface.

En nu wordt de realiteit van live-achtergronden onthuld: bij het implementeren van de WallpaperService.Engine, is het enige wat je doet tekenen naar een opgegeven Surface (via een SurfaceHolder). Het is bijna zo eenvoudig. Voordat we de implementatie van de WallpaperService.Engine bekijken, laten we eens kijken naar enkele van de andere configuratieaspecten.


Stap 2: De achtergrond definiëren

Aangezien een live achtergrond een service is, moet u de service registreren in uw manifestbestand. De serviceregistratie ziet er ongeveer zo uit:

      

Er zijn een paar dingen om op te merken hier. Ten eerste vereist het gebruik van deze service de BIND_WALLPAPER-machtiging (dat wil zeggen dat een andere app die deze achtergrond gebruikt, de BIND_WALLPAPER-machtiging als gebruiksmachtigingangst in hun manifest vereist). Ten tweede is het intentfilter een string vergelijkbaar met de basisklasse. Ten slotte wijzen de metadata naar een XML-bestand. Dit XML-bestand, gedefinieerd door de ontwikkelaar, biedt nog wat extra achtergrondconfiguratie. Dit is ons XML-bestand voor de instellingen voor live wallpaper, genaamd fallingsnow_wp:

  

Hier gebruiken we gewoon het pictogram van de gewone launcher als miniatuur en verwijzen we naar een tekenreeks die wordt weergegeven als de beschrijving in de lijst met achtergronden. Als je live wallpaper moet worden geconfigureerd, wijs je erop met de eigenschap android: settingsActivity.

Vergeet tot slot, terug in je manifestbestand, niet om de use-feature in te stellen voor android.software.live_wallpaper:

 

Stap 3: Bekabeling van de bedradingsservice-motor

Nu de saaie, maar toch kritische dingen uit de weg zijn geruimd, gaan we terug naar het echte werk: de klasse WallpaperService.Engine maken. Omdat we al een RenderScript-bestand hebben voor sommige animaties, hoeven we alleen maar de weergave aan het nieuwe oppervlak te koppelen. De onSurfaceCreated () -methode van Engine is een geweldige plek om het RenderScriptGL-object te maken dat we nodig hebben:

 @Override public void onSurfaceCreated (SurfaceHolder holder) super.onSurfaceCreated (holder); RenderScriptGL.SurfaceConfig surfaceConfig = nieuw RenderScriptGL.SurfaceConfig (); mRenderScriptGL = new RenderScriptGL (FallingSnowWallpaperService.this, surfaceConfig); // gebruik laag voor wallpapers mRenderScriptGL.setPriority (RenderScript.Priority.LOW); 

We stellen ook de renderprioriteit in op een lage waarde - dit is een live wallpaper en geen kritieke game of UI-renderingengine. Het moet niets anders op het systeem vertragen.

Ruim dit op in de methode onSurfaceDestroyed ():

 @Override public void onSurfaceDestroyed (SurfaceHolder holder) super.onSurfaceDestroyed (holder); if (mSnowRS! = null) mSnowRS.stop (); mSnowRS = null;  if (mRenderScriptGL! = null) mRenderScriptGL.destroy (); mRenderScriptGL = null; 

De methode onSurfaceChanged () is een geweldige plaats om de RenderScript-klasse te initialiseren. Dit is de eerste plaats waar u details kunt vinden over wat u wilt renderen, zoals de breedte en hoogte. Dit is ook de plaats waar we het oppervlak voor de RenderScriptGL-klasse bepalen.

 @Override public void onSurfaceChanged (SurfaceHolder-houder, int-formaat, int-breedte, int-hoogte) super.onSurfaceChanged (houder, formaat, breedte, hoogte); if (mRenderScriptGL! = null) mRenderScriptGL.setSurface (houder, breedte, hoogte);  if (mSnowRS == null) mSnowRS = new SnowRS (width, height); mSnowRS.init (mRenderScriptGL, getResources (), isPreview ()); mSnowRS.start (); 

Het is een goed idee om de achtergrond te stoppen wanneer deze niet zichtbaar is.

 @Override public void onVisibilityChanged (boolean visible) super.onVisibilityChanged (visible); if (mSnowRS == null) if (visible) mSnowRS.start ();  else mSnowRS.stop (); 

En dat is het. De live wallpaper rolt. Of animeert. Of doet wat je wilt dat het doet.

Wilt u reageren op tikken? Overschrijf de methode onCommand () van de klasse WallpaperService.Engine.

Wilt u posities aanpassen wanneer de gebruiker veegt tussen de pagina's van het startscherm? Overschrijf de methode onOffsetsChanged () van de klasse WallpaperService.Engine.

Wilt u weten of de gebruiker het voorbeeld bekijkt voordat de achtergrond wordt ingesteld? Roep de methode isPreview () van de klasse WallpaperService.Engine aan en controleer de resultaten.

De volledige implementatie van onze WallpaperService.Engine-klasse is te vinden in FallSnowWallpaperService.java van het open-sourceproject.

Laten we de Live Wallpaper bekijken:

Dat moet bekend voorkomen; het is hetzelfde als wat we zagen in de RenderScript-activiteit.


Stap 4: Enkele opmerkingen over prestaties

Live achtergronden zijn een geweldige plek om zeer efficiënte en goed presterende grafische effecten te maken. Maar u moet dit doen door u te realiseren dat de gebruiker niet noodzakelijkerwijs zit te kijken naar een demo (weet u, zoals die van scene.org). Wat dit betekent is dat je mogelijk de framesnelheden moet verlagen, pixels, polygoontellingen of textuurdetails moet verminderen om de achtergrond interessant te houden, maar niet belastend voor de CPU, GPU en batterij. Als gebruikers merken dat uw live wallpaper hun batterij opeet, ziet uw app er slecht uit en ziet hun apparaat er zwak uit met een lage levensduur van de batterij. Een slechte ervaring met een Android-apparaat zorgt ervoor dat alle ontwikkelaars een slechte rap krijgen.


Stap 5: De demoweergave

De demo-weergave en activiteit (van de vorige zelfstudie) is nog steeds beschikbaar wanneer de app wordt gestart. In plaats van het te verwijderen, waarom dan niet gewoon een handler toevoegen, zodat wanneer een gebruiker erop klikt, de instellingen voor live wallpaper verschijnen zodat de gebruiker de live wallpaper kan selecteren?

 public void onWallpaperSettings (View view) Intent wallpaperSettings = new Intent (Intent.ACTION_SET_WALLPAPER); startActivity (wallpaperSettings); 

Waarom niet, inderdaad! Dat was gemakkelijk. Voeg bij elke klikbare weergave de eigenschap android: onClick = "onWallpaperSettings" toe en u bent klaar om te gaan.

Hier is een stilstaand beeld:


Conclusie

Live-achtergronden zijn een handige manier om uw toepassing uit te breiden tot buiten de gebruikelijke grenzen. Heb je een rollenspel? Maak een aantal nette live-wallpapers met de hoofdpersonen. Zorg er gewoon voor dat u gezond verstand gebruikt bij het renderen naar het scherm, zodat de ervaring van de gebruiker met zijn apparaat er niet onder lijdt.

Laat ons weten welke coole live wallpapers je aan het bouwen bent in de reacties!

Over de Auteurs

Mobiele ontwikkelaars Lauren Darcey en Shane Conder hebben samen meerdere boeken geschreven over Android-ontwikkeling: een diepgaand programmeerboek getiteld Android Wireless Application Development en Sams Teach Yourself Android Application Development in 24 uur. Wanneer ze niet schrijven, besteden ze hun tijd aan het ontwikkelen van mobiele software bij hun bedrijf en het leveren van consultingservices. Ze zijn te bereiken via e-mail naar [email protected], via hun blog op androidbook.blogspot.com, en op Twitter @androidwireless.

Meer hulp nodig bij het schrijven van Android-apps? Bekijk onze nieuwste boeken en bronnen!