J'ai cherché partout une solution appropriée à mon problème et je n'arrive pas encore à en trouver une. J'ai une ActionBar (ActionBarSherlock) avec un menu qui est gonflé à partir d'un fichier XML et ce menu contient un élément et cet élément est affiché comme un ActionItem.
menu:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_refresh"
android:icon="@drawable/ic_menu_refresh"
android:showAsAction="ifRoom"
android:title="Refresh"/>
</menu>
activité:
[...]
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.mymenu, menu);
return true;
}
[...]
L'ActionItem est affiché avec une icône et pas de texte, mais lorsqu'un utilisateur clique sur l'ActionItem, je veux que l'icône commence à s'animer, plus précisément, à tourner sur place. L'icône en question est une icône de rafraîchissement.
Je me rends compte qu'ActionBar prend en charge l'utilisation de vues personnalisées ( Ajout d'une vue d'action ), mais cette vue personnalisée est étendue pour couvrir toute la zone de l'ActionBar et bloque en fait tout sauf l'icône de l'application, qui dans mon cas n'est pas ce que je recherchais .
Ma prochaine tentative a donc été d'essayer d'utiliser AnimationDrawable et de définir mon animation image par image, de définir le dessinable comme icône de l'élément de menu, puis d' onOptionsItemSelected(MenuItem item)
obtenir l'icône et de commencer à animer en utilisant ((AnimationDrawable)item.getIcon()).start()
. Cela a cependant échoué. Quelqu'un connaît-il un moyen d'accomplir cet effet?
android:paddingLeft="12dp"
etandroid:paddingRight="12dp"
à mon propre thème.J'ai travaillé un peu sur la solution en utilisant ActionBarSherlock, j'ai trouvé ceci:
res / layout / indeterminate_progress_action.xml
res / layout-v11 / indeterminate_progress_action.xml
res / drawable / rotation_refresh.xml
Code en activité (je l'ai dans la classe parent ActivityWithRefresh)
dans l'activité création d'éléments de menu
Et l'icône, c'est
drawable-xhdpi/ic_menu_navigation_refresh.png
Cela peut être trouvé dans http://developer.android.com/design/downloads/index.html#action-bar-icon-pack
la source
En plus de ce que Jake Wharton a dit, vous devriez probablement faire ce qui suit pour vous assurer que l'animation s'arrête en douceur et ne saute pas. le chargement terminé.
Tout d'abord, créez un nouveau booléen (pour toute la classe):
Trouvez la méthode qui démarre votre chargement. Définissez votre valeur booléenne sur true lorsque l'activité commence à se charger.
Trouvez la méthode qui démarre lorsque votre chargement est terminé. Au lieu d'effacer l'animation, définissez votre valeur booléenne sur false.
Définissez un AnimationListener sur votre animation:
Ensuite, chaque fois que l'animation a été exécutée une fois, cela signifie que lorsque votre icône a effectué une rotation, vérifiez l'état de chargement, et si ce n'est plus le cas, l'animation s'arrêtera.
De cette façon, l'animation ne peut être arrêtée que si elle a déjà tourné jusqu'à la fin et sera répétée sous peu ET qu'elle ne se charge plus.
C'est du moins ce que j'ai fait quand j'ai voulu mettre en œuvre l'idée de Jake.
la source
Il existe également une option pour créer la rotation dans le code. Snip complet:
la source
Avec la bibliothèque de support, nous pouvons animer l'icône sans actionView personnalisée.
Nous ne pouvons pas animer dessiné directement, utilisez donc DrawableWrapper (à partir de android.support.v7 pour l'API <21):
J'ai pris l'idée de DrawableWrapper d'ici: https://stackoverflow.com/a/39108111/5541688
la source
sa solution très simple (par exemple, besoin d'un refactor) fonctionne avec MenuItem standart, vous pouvez l'utiliser avec n'importe quel nombre d'états, d'icônes, d'animations, de logique, etc.
en classe d'activité:
auditeur standard:
dans refreshData () faites quelque chose comme ceci:
méthode pour définir la couleur ou l'animation de l'icône:
il y a 2 mises en page avec l'icône (R.layout.refresh_action_view (+ "_actual")):
animation de rotation standard dans ce cas (R.anim.rotation):
la source
le meilleur moyen est ici:
puis:
N'oubliez pas que vous ne pouvez pas accéder à "btsync = this.findViewById (R.id.action_sync);" à onCreate () ou onStart () ou onResume () ou onPostResume () ou onPostCreate () ou onCreateOptionsMenu () ou onPrepareOptionsMenu () si vous voulez l'obtenir juste après le début de l'activité, mettez-le dans un postdélayé:
la source