Création de fonds d'écran en direct sur Android

Android propose de nombreuses fonctionnalités de personnalisation pour aider les utilisateurs à personnaliser de nombreux aspects de l'expérience de leurs appareils. L'une de ces fonctionnalités est le papier peint en direct. Les fonds d'écran animés ne restent pas sous forme d'images d'arrière-plan statiques, mais possèdent plutôt des fonctionnalités interactives. Apprenez à créer un fond d'écran en direct dans ce tutoriel!

Un fond d’écran animé, sous Android, est normalement utilisé comme arrière-plan sur l’écran d’accueil pour animer ou changer au fil du temps. Si vous avez un appareil Android, vous avez probablement déjà vu quelques-uns des fonds d'écran animés intégrés, comme celui où les feuilles semblent tomber dans une eau ridée..

En tant que développeur, vous pouvez créer et publier des fonds d'écran animés. Le processus n'est pas particulièrement difficile. Faire un fond d'écran animé à la fois fascinant et désirable sans épuiser la batterie de l'appareil de l'utilisateur est toutefois un défi. Dans ce didacticiel, nous allons vous guider dans le processus de création d’un fond d’écran en direct qui se comporte. :)


Étape 0: Mise en route

Récemment, nous vous avons montré comment utiliser RenderScript. Le résultat final de ce tutoriel était un simple effet de chute de neige. Tournons cet effet en fond d'écran.

Le code open source de ce tutoriel est disponible au téléchargement. Nous vous recommandons de l'utiliser pour suivre. Les listes de codes de ce didacticiel n'incluent pas le contenu intégral de chaque fichier et ne couvrent pas la configuration du projet ni le code traité dans les didacticiels précédents..


Étape 1: service ou moteur?

Vous pourriez dire qu'un fond d'écran en direct n'est qu'un service. Après tout, pour créer un fond d'écran animé, vous devez simplement étendre la classe WallpaperService et implémenter une seule méthode, souvent avec une seule ligne de code, puis ajouter la définition de votre service au fichier manifeste..

Voyons à quoi cela ressemble. Voici le WallpaperService:

 public class FallingSnowWallpaperService étend WallpaperService @Override public Engine surCreateEngine () retourne une nouvelle FallingSnowWallpaperEngine (); 

Et tu as fini! Ok pas vraiment. Le gros du travail d'un fond d'écran animé a lieu dans une implémentation WallpaperService.Engine. C'est là que vous pouvez répondre à des rappels tels que onSurfaceChanged () et onSurfaceCreated (). Semble familier? Celles-ci sont très similaires aux rappels que vous avez peut-être vus lors de l'implémentation d'une vue ou d'un autre objet basé sur la surface..

Et maintenant, la réalité des fonds d'écran animés est révélée: lors de la mise en œuvre de WallpaperService.Engine, tout ce que vous faites est de dessiner sur une surface fournie (via un SurfaceHolder). C'est presque aussi simple que ça. Avant de passer à l’implémentation de WallpaperService.Engine, examinons certains des autres aspects de la configuration..


Étape 2: Définition du papier peint

Étant donné qu'un fond d'écran animé est un service, vous devez l'enregistrer dans votre fichier manifeste. L'enregistrement de service pourrait ressembler à quelque chose comme ça:

      

Il y a plusieurs choses à noter ici. Tout d’abord, l’utilisation de ce service nécessite l’autorisation BIND_WALLPAPER (c’est-à-dire qu’une autre application utilisant ce fond d’écran aurait besoin de l’autorisation BIND_WALLPAPER en tant qu’entrée en mode utilisations dans leur manifeste). Deuxièmement, le filtre d'intention est une chaîne similaire à la classe de base. Enfin, les métadonnées pointent vers un fichier XML. Ce fichier XML, défini par le développeur, fournit une configuration supplémentaire de papier peint. Voici notre fichier XML pour les paramètres de fond d'écran animé appelé fallingsnow_wp:

  

Ici, nous utilisons simplement l’icône du lanceur habituel comme vignette et pointons vers une chaîne qui apparaîtra comme description dans la liste des fonds d’écran. Si votre fond d'écran animé a besoin d'être configuré, pointez-le avec la propriété android: settingsActivity..

Enfin, dans votre fichier manifeste, n'oubliez pas de définir la propriété uses pour android.software.live_wallpaper:

 

Étape 3: Câblage du moteur du service de papier peint

Maintenant que les choses ennuyeuses, mais critiques, sont hors de propos, revenons au vrai travail: créer la classe WallpaperService.Engine. Comme nous avons déjà un fichier RenderScript pour faire de l'animation, il suffit de lier le rendu à la nouvelle surface. La méthode onSurfaceCreated () de Engine est un excellent endroit pour créer l'objet RenderScriptGL dont nous avons besoin:

 @Override public null onSurfaceCreated (titulaire SurfaceHolder) super.onSurfaceCreated (titulaire); RenderScriptGL.SurfaceConfig surfaceConfig = new RenderScriptGL.SurfaceConfig (); mRenderScriptGL = new RenderScriptGL (FallingSnowWallpaperService.this, surfaceConfig); // utilise low pour les fonds d'écran mRenderScriptGL.setPriority (RenderScript.Priority.LOW); 

Nous avons également défini la priorité de rendu sur faible - il s'agit d'un fond d'écran animé et non d'un jeu critique ou d'un moteur de rendu d'interface utilisateur. Il ne devrait rien ralentir sur le système.

Nettoyez cela dans la méthode onSurfaceDestroyed ():

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

La méthode onSurfaceChanged () est un excellent endroit pour initialiser la classe RenderScript. C'est le premier endroit où vous trouverez des détails sur ce que vous allez rendre, tels que la largeur et la hauteur. C'est également à cet endroit que nous définissons la surface pour la classe RenderScriptGL.

 @Override public void onSurfaceChanged (titulaire SurfaceHolder, format int, largeur int, hauteur hauteur) super.onSurfaceChanged (titulaire, format, largeur, hauteur); if (mRenderScriptGL! = null) mRenderScriptGL.setSurface (titulaire, largeur, hauteur);  if (mSnowRS == null) mSnowRS = new SnowRS (largeur, hauteur); mSnowRS.init (mRenderScriptGL, getResources (), isPreview ()); mSnowRS.start (); 

C'est une bonne idée d'arrêter le fond d'écran quand il n'est pas visible.

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

Et c'est tout. Le papier peint en direct roule. Ou anime. Ou fait ce que vous voulez faire.

Voulez-vous répondre aux robinets? Remplacer la méthode onCommand () de la classe WallpaperService.Engine.

Voulez-vous ajuster les positions lorsque l'utilisateur glisse entre les pages de l'écran d'accueil? Remplace la méthode onOffsetsChanged () de la classe WallpaperService.Engine.

Vous voulez savoir si l'utilisateur visualise l'aperçu avant de définir le fond d'écran? Appelez la méthode isPreview () de la classe WallpaperService.Engine et vérifiez les résultats..

L’implémentation complète de notre classe WallpaperService.Engine est disponible dans FallSnowWallpaperService.java du projet open source..

Jetons un coup d'oeil au Live Wallpaper:

Cela devrait sembler familier; c'est la même chose que nous avons vue dans l'activité RenderScript.


Étape 4: Quelques notes sur les performances

Le fond d'écran animé est un bon endroit pour créer des effets graphiques extrêmement efficaces et performants. Mais vous devez le faire en réalisant que l'utilisateur n'est pas nécessairement assis à regarder une démonstration (vous savez, comme celles de scene.org). Cela signifie que vous devrez peut-être réduire la fréquence des images, le nombre de pixels, le nombre de polygones ou les détails de texture pour que le fond d'écran reste intéressant, mais sans stress pour le processeur, le processeur graphique ou la batterie. Si les utilisateurs constatent que votre fond d'écran en direct consomme leur batterie, l'application devient mauvaise et leur appareil semble faible avec une faible autonomie. Une mauvaise expérience avec un appareil Android provoque tous les développeurs d'un mauvais coup.


Étape 5: La vue démo

La vue démo et l'activité (du didacticiel précédent) sont toujours disponibles au lancement de l'application. Au lieu de le supprimer, pourquoi ne pas simplement ajouter un gestionnaire afin que, lorsqu'un utilisateur clique dessus, les paramètres de fond d'écran en direct apparaissent afin que l'utilisateur puisse sélectionner le fond d'écran en direct?

 public void onWallpaperSettings (Afficher la vue) Intention wallpaperSettings = new Intent (Intent.ACTION_SET_WALLPAPER); startActivity (wallpaperSettings); 

Pourquoi pas, en effet! C'était facile. Sur n'importe quelle vue cliquable, ajoutez simplement la propriété android: onClick = "onWallpaperSettings" et vous êtes prêt à partir.

Voici une image fixe:


Conclusion

Le fond d'écran animé est un moyen pratique d'étendre votre application au-delà de ses limites habituelles. Vous avez un jeu de rôle? Faire des fonds d'écran animés mettant en vedette les personnages principaux. Assurez-vous simplement de faire preuve de bon sens lors du rendu à l'écran, de sorte que l'expérience de l'utilisateur avec son périphérique ne soit pas affectée..

Dites-nous quels sont les fonds d'écran animés que vous construisez dans les commentaires!

à propos des auteurs

Les développeurs mobiles Lauren Darcey et Shane Conder ont co-écrit plusieurs livres sur le développement Android: un livre de programmation en profondeur intitulé Développement d'applications sans fil Android et Sams Teach Yourself Développement d'applications Android en 24 heures. Lorsqu'ils n'écrivent pas, ils passent leur temps à développer des logiciels mobiles dans leur entreprise et à fournir des services de conseil. Vous pouvez les contacter par courrier électronique à l'adresse [email protected], via leur blog à l'adresse androidbook.blogspot.com et sur Twitter @androidwireless..

Besoin d'aide pour écrire des applications Android? Consultez nos derniers livres et ressources!