Creazione di sfondi animati su Android

Android ha una serie di funzioni di personalizzazione per aiutare gli utenti a personalizzare molti aspetti della loro esperienza utente. Una di queste caratteristiche è la carta da parati dal vivo. Gli sfondi live non rimangono come immagini di sfondo statiche ma hanno invece funzionalità interattive. Scopri come creare uno sfondo animato in questo tutorial!

Uno sfondo animato, su Android, viene normalmente utilizzato come sfondo nella schermata iniziale che si anima o cambia nel tempo in qualche modo. Se hai un dispositivo Android, probabilmente hai visto un paio di sfondi live incorporati, come quello in cui le foglie sembrano cadere nell'acqua increspata.

Come sviluppatore, puoi creare e pubblicare sfondi live. Il processo non è particolarmente difficile. Creare uno sfondo dal vivo che sia affascinante e desiderabile pur non scaricando la batteria del dispositivo dell'utente è, comunque, una sfida. In questo tutorial, ti guideremo attraverso il processo di creazione di uno sfondo animato che si comporta. :)


Passaggio 0: Introduzione

Di recente ti abbiamo mostrato come usare RenderScript. Il risultato finale di quel tutorial era un semplice effetto di caduta della neve. Trasformiamo quell'effetto in uno sfondo animato.

Il codice open source per questo tutorial è disponibile per il download. Raccomandiamo di usarlo per seguirlo. Gli elenchi di codici in questo tutorial non includono l'intero contenuto di ciascun file e non coprono l'installazione del progetto o il codice trattato nelle esercitazioni precedenti.


Passaggio 1: servizio o motore?

Si potrebbe dire che uno sfondo animato è solo un servizio. Dopo tutto, per creare uno sfondo live, basta estenderlo dalla classe WallpaperService e implementare un singolo metodo, spesso con una sola riga di codice, e quindi aggiungere la definizione del servizio al file manifest.

Vediamo come si presenta. Ecco il WallpaperService:

 public class FallingSnowWallpaperService estende WallpaperService @Override public engine onCreateEngine () return new FallingSnowWallpaperEngine (); 

E hai finito! Ok, non proprio. La maggior parte del lavoro di uno sfondo animato si svolge in un'implementazione di WallpaperService.Engine. Qui è dove è possibile rispondere a callback come onSurfaceChanged () e onSurfaceCreated (). Suona familiare? Questi sono molto simili ai callback che potresti aver visto durante l'implementazione di una vista o di un altro oggetto basato sulla superficie.

E ora viene rivelata la realtà degli sfondi live: quando si implementa WallpaperService.Engine, tutto ciò che si sta facendo è disegnare su Surface (tramite SurfaceHolder). È quasi così semplice. Prima di arrivare all'implementazione di WallpaperService.Engine, esaminiamo alcuni degli altri aspetti della configurazione.


Passaggio 2: definizione dello sfondo

Poiché uno sfondo animato è un servizio, è necessario registrare il servizio nel file manifest. La registrazione del servizio potrebbe essere simile a questa:

      

Ci sono un paio di cose da notare qui. Innanzitutto, l'utilizzo di questo servizio richiede l'autorizzazione BIND_WALLPAPER (ad esempio, un'altra app che utilizza questo sfondo richiede l'autorizzazione BIND_WALLPAPER come voce di autorizzazione all'uso nel proprio file manifest). In secondo luogo, il filtro intent è una stringa simile alla classe base. Infine, i meta-dati puntano a un file XML. Questo file XML, definito dallo sviluppatore, fornisce una configurazione aggiuntiva per lo sfondo. Ecco il nostro file XML per le impostazioni live wallpaper chiamate fallingsnow_wp:

  

Qui, semplicemente usiamo l'icona di avvio normale come anteprima e puntiamo a una stringa che verrà visualizzata come descrizione nell'elenco degli sfondi. Se il tuo sfondo live necessita di configurazione, devi puntare ad esso con la proprietà android: settingsActivity.

Infine, torna nel file manifest, non dimenticare di impostare la funzione uses per android.software.live_wallpaper:

 

Passaggio 3: cablaggio del motore di servizio di sfondo

Ora che le cose noiose, ma critiche, sono fuori mano, torniamo al lavoro reale: creare la classe WallpaperService.Engine. Dato che abbiamo già un file RenderScript per fare alcune animazioni, tutto ciò che dobbiamo fare è collegare il rendering alla nuova superficie. Il metodo onSurfaceCreated () di Engine è un ottimo posto per creare l'oggetto RenderScriptGL di cui abbiamo bisogno:

 @Override public void onSurfaceCreated (titolare di SurfaceHolder) super.onSurfaceCreated (titolare); RenderScriptGL.SurfaceConfig surfaceConfig = new RenderScriptGL.SurfaceConfig (); mRenderScriptGL = new RenderScriptGL (FallingSnowWallpaperService.this, surfaceConfig); // usa basso per gli sfondi mRenderScriptGL.setPriority (RenderScript.Priority.LOW); 

Impostiamo anche la priorità di rendering su bassa: si tratta di uno sfondo animato e non di un motore di rendering critico o di rendering dell'interfaccia utente. Non dovrebbe rallentare nient'altro sul sistema.

Pulisci questo nel metodo onSurfaceDestroyed ():

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

Il metodo onSurfaceChanged () è un ottimo posto per inizializzare la classe RenderScript. Questo è il primo posto in cui trovi i dettagli di ciò a cui ti stai rendendo, come la larghezza e l'altezza. Questo è anche il punto in cui impostiamo la superficie per la classe RenderScriptGL.

 @Override public void onSurfaceChanged (titolare di SurfaceHolder, int format, int width, int height) super.onSurfaceChanged (titolare, formato, larghezza, altezza); if (mRenderScriptGL! = null) mRenderScriptGL.setSurface (holder, width, height);  if (mSnowRS == null) mSnowRS = new SnowRS (larghezza, altezza); mSnowRS.init (mRenderScriptGL, getResources (), isPreview ()); mSnowRS.start (); 

È una buona idea fermare lo sfondo quando non è visibile.

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

E questo è tutto. La carta da parati dal vivo rotola. O anima. O fa tutto ciò che vuoi che faccia.

Vuoi rispondere ai tocchi? Sostituire il metodo onCommand () della classe WallpaperService.Engine.

Vuoi regolare le posizioni quando l'utente passa da una schermata all'altra? Sovrascrivi il metodo onOffsetsChanged () della classe WallpaperService.Engine.

Vuoi sapere se l'utente sta visualizzando l'anteprima prima di impostare lo sfondo? Chiama il metodo isPreview () della classe WallpaperService.Engine e controlla i risultati.

La piena implementazione della nostra classe WallpaperService.Engine può essere trovata in FallSnowWallpaperService.java del progetto open source.

Diamo un'occhiata al Live Wallpaper:

Questo dovrebbe sembrare familiare; è la stessa cosa che abbiamo visto nell'attività di RenderScript.


Passaggio 4: alcune note sulle prestazioni

Gli sfondi animati sono il luogo ideale per realizzare effetti grafici altamente efficienti e di grande effetto. Ma è necessario farlo rendendosi conto che l'utente non è necessariamente seduto lì a guardare una demo (lo sai, come quelli di scene.org). Ciò significa che potrebbe essere necessario ridurre i frame rate, ridurre i pixel, i conteggi dei poligoni oi dettagli delle texture per mantenere lo sfondo interessante, ma non stressante su CPU, GPU e batteria. Se gli utenti scoprono che il tuo sfondo live sta consumando la batteria, la tua app sembra scadente e il suo dispositivo sembra debole con una batteria scarica. Una brutta esperienza con un dispositivo Android fa sì che tutti gli sviluppatori subiscano un brutto colpo.


Passaggio 5: la vista demo

La vista demo e l'attività (dal tutorial precedente) sono ancora disponibili all'avvio dell'app. Invece di rimuoverlo, perché non aggiungere semplicemente un gestore in modo che quando un utente fa clic su di esso, le impostazioni dello sfondo live verranno visualizzate in modo che l'utente possa selezionare lo sfondo animato?

 public void onWallpaperSettings (Visualizza vista) Intent wallpaperSettings = new Intent (Intent.ACTION_SET_WALLPAPER); startActivity (wallpaperSettings); 

Perché no, anzi! È stato facile. In qualsiasi visualizzazione selezionabile, aggiungi la proprietà android: onClick = "onWallpaperSettings" e sei pronto per andare.

Ecco un'immagine fissa:


Conclusione

Gli sfondi live sono un modo conveniente per espandere la tua applicazione oltre i suoi tipici limiti. Hai un gioco di ruolo? Crea degli sfondi animati con i personaggi principali. Assicurati di usare il buon senso durante il rendering sullo schermo in modo che l'esperienza dell'utente con il proprio dispositivo non ne risenta.

Facci sapere quali fantastici sfondi live stai creando nei commenti!

Riguardo agli Autori

Gli sviluppatori mobili Lauren Darcey e Shane Conder hanno coautore diversi libri sullo sviluppo di Android: un libro di programmazione approfondito intitolato Sviluppo di applicazioni wireless Android e Sams ti insegna a sviluppare applicazioni Android in 24 ore. Quando non scrivono, passano il loro tempo a sviluppare software mobile presso la loro azienda ea fornire servizi di consulenza. Possono essere contattati via email a [email protected], tramite il loro blog su androidbook.blogspot.com e su Twitter @androidwireless.

Hai bisogno di più aiuto nella scrittura di app per Android? Consulta i nostri ultimi libri e risorse!