32 votes

Animations des widgets de l'écran d'accueil d'Android

Je cherche à créer un widget qui prend en charge l'animation, idéalement via le cadre Android.view.animation, sinon en définissant les propriétés des vues distantes dans un code déclenché par un service d'arrière-plan.

Quelqu'un a-t-il de l'expérience dans l'une ou l'autre de ces approches ? Ce que j'essaie de faire est-il faisable ou est-ce que je m'engage dans une voie sans issue ?

15voto

Jeremy Edwards Points 6999

Il est en fait possible d'animer les widgets RemoteView. Le problème est qu'il est très restrictif, ce qui est voulu en raison des implications en matière de sécurité de l'exécution d'un code personnalisé dans un processus système.

Ce que je veux dire par là, c'est qu'Android ne fonctionnera qu'avec les animations exprimées dans des fichiers xml res/anim qui sont liés aux mises en page via xml. Certains widgets RemoteView supportent cela

Un exemple de cela est le widget de l'application Nouvelles et Météo qui est fourni sur un système Android standard. Ce qu'il fait, c'est utiliser un ViewFlipper pour faire défiler chaque article toutes les 10 secondes environ.

    <ViewFlipper android:layout_width="match_parent" android:layout_height="wrap_content" android:measureAllChildren="true" android:flipInterval="10000" android:autoStart="true"
android:inAnimation="@android:anim/fade_in" android:outAnimation="@android:anim/fade_out" android:animateFirstView="true">
      <TextView android:id="@+id/Description1TextView" style="@style/AWCText.Centered" android:layout_width="match_parent" android:layout_height="wrap_content"/>
      <TextView android:id="@+id/Description2TextView" style="@style/AWCText.Centered" android:layout_width="match_parent" android:layout_height="wrap_content"/>
      <TextView android:id="@+id/Description3TextView" style="@style/AWCText.Centered" android:layout_width="match_parent" android:layout_height="wrap_content"/>
      <TextView android:id="@+id/Description4TextView" style="@style/AWCText.Centered" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    </ViewFlipper>

Dans cet exemple, vous pouvez lier des intentions en attente à chaque TextView. Ainsi, lorsqu'un utilisateur clique sur l'un d'entre eux, une action différente peut se produire.

Enfin, Android a lentement ajouté la prise en charge des vues animées dans chaque version. Par exemple, les TransitionDrawables (drawable de sélection à fondu enchaîné) n'ont pas de fondu enchaîné avant Android 3.0.

2voto

xandy Points 13480

C'est possible, mais utilisez-le avec prudence, car il est très lourd pour l'implémentation de l'écran d'accueil par défaut et vous ne devriez pas l'utiliser très souvent.

Dans le widget Mario Coin Block J'utilise une telle technique pour faire l'animation, vous pouvez vérifier le code source : http://code.google.com/p/mario-coin-block/source/browse/trunk/MarioWidget.CoinBlock/src/com/gueei/mario/coinBlock/view/CoinBlockView.java

En gros, l'idée est de dessiner manuellement sur un bitmap hors écran, et de remplacer le bitmap du BitmapView par celui-ci en utilisant l'appel RemoveViews.

1voto

Orest Points 691

Vous pouvez avoir seulement des animations simples comme fadeIn ou fadeOut sur votre widget, c'est très simple, vous n'avez pas besoin d'animations de mise en page, il suffit d'utiliser ViewFlipper (il m'a fallu 3 jours de recherche pour découvrir que c'est si facile).

Pourtant, il est impossible d'écrire quelque chose de vraiment génial sans utiliser des lanceurs personnalisés.

1voto

uval Points 2127

Je suis d'accord avec les autres réponses ici, donc je ne vais pas répéter - une animation limitée sur un widget est possible, mais lourde en ressources, elle pourrait rendre l'écran d'accueil lent et moins réactif, et épuiser la batterie. D'après mon expérience, le fonctionnement n'est pas fluide. En résumé, il n'y a pas de problème s'il ne s'agit que de quelques images qui changent de temps en temps, ou pour certains effets, rarement sur un événement (par exemple, une pression de l'utilisateur ou un événement de votre service).

Mais voici une idée qui ne répond probablement pas directement à votre question, mais qui pourrait être une alternative appropriée (je ne connais pas votre cas d'utilisation, cela pourrait ne pas être pertinent du tout) Avez-vous envisagé de mettre en œuvre un fond d'écran vivant ?

pour - animation de très haute qualité, peut être contrôlé depuis l'arrière-plan

contre - non interactif, remplace le fond d'écran de l'utilisateur... et il est difficile de satisfaire les goûts de chacun

0voto

Rotemmiz Points 4152

Les animations sont impossibles sur les RemoteViews, et les mises à jour des RemoteViews peuvent se produire à un rythme d'une fois toutes les 30 minutes (ou manuellement)...

Quoi qu'il en soit, vous pouvez essayer le lien suivant : is-there-a-way-to-animate-on-a-home-widget (en anglais)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X