60 votes

Android ImageView Animation

J'ai créé une mise en page avec une vue image et une vue Web. La vue Web est définie pour avoir une visibilité par défaut de gone. Lorsque l'activité se déclenche, elle affiche d'abord la vue image et lorsque la vue web a fini de charger son URL, elle se marque comme visible et la vue image est marquée comme cachée.

Lorsque l'image est affichée, j'aimerais qu'elle tourne de manière répétée, juste pour donner un peu plus d'éclat.

Je n'ai jamais fait d'animations auparavant sous Android et tous les articles que j'ai trouvés en interrogeant l'internet n'ont pas été utiles ; je suis donc revenu à SO pour obtenir de l'aide.

Donc si je commence avec ça...

    final ImageView splash = (ImageView)findViewById(R.id.splash);

Comment créer une animation de rotation répétée et l'appliquer à l'ImageView ?

Merci encore !

103voto

Christopher Orr Points 58514

Utilisez un RotateAnimation en plaçant le point de pivot au centre de votre image.

RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f);
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE);
anim.setDuration(700);

// Start animating the image
final ImageView splash = (ImageView) findViewById(R.id.splash);
splash.startAnimation(anim);

// Later.. stop the animation
splash.setAnimation(null);

50voto

Matt Points 83

Comment faire pivoter une image autour de son centre :

ImageView view = ... //Initialize ImageView via FindViewById or programatically

RotateAnimation anim = new RotateAnimation(0.0f, 360.0f, Dimension.RelativeToSelf, 0.5f, Dimension.RelativeToSelf, 0.5f);

//Setup anim with desired properties
anim.setInterpolator(new LinearInterpolator());
anim.setRepeatCount(Animation.INFINITE); //Repeat animation indefinitely
anim.setDuration(700); //Put desired duration per anim cycle here, in milliseconds

//Start animation
view.startAnimation(anim); 
//Later on, use view.setAnimation(null) to stop it.

Cela fera pivoter l'image autour de son centre (0,5 ou 50 % de sa largeur/hauteur). Je mets ceci à la disposition des futurs lecteurs qui arrivent ici depuis Google, comme moi, et qui souhaitent faire tourner l'image autour de son centre sans définir ce centre en pixels absolus.

24voto

Steve Haley Points 26928

Vous pouvez aussi simplement utiliser la fonction d'animation Rotation. Celle-ci permet d'exécuter une animation spécifique, pendant une durée prédéterminée, sur une ImageView.

Animation rotate = AnimationUtils.loadAnimation([context], R.anim.rotate_picture);
splash.startAnimation(rotate);

Créez ensuite un fichier XML d'animation dans votre res/anim appelé rotate_picture avec le contenu :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false">

    <rotate 
    android:fromDegrees="0"
    android:toDegrees="360"
    android:duration="5000"
    android:pivotX="50%"
    android:pivotY="50%">
</rotate>
</set>

Maintenant, malheureusement, cela ne le fera qu'une fois. Vous aurez besoin d'une boucle quelque part pour faire répéter l'animation pendant qu'elle attend. J'ai expérimenté un peu et mon programme est resté coincé dans des boucles infinies, donc je ne suis pas sûr de la meilleure façon de le faire. EDIT : La réponse de Christopher fournit l'information sur la façon de faire une boucle correctement, donc je retire ma mauvaise suggestion sur les fils séparés !

11voto

Alex Volovoy Points 34562

Une solution : divisez votre image en N en la faisant pivoter légèrement à chaque fois. Je dirais que 5 suffisent. Créez ensuite quelque chose comme ceci dans drawable

<animation-list   android:id="@+id/handimation" android:oneshot="false" 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/progress1" android:duration="150" />
    <item android:drawable="@drawable/progress2" android:duration="150" />
    <item android:drawable="@drawable/progress3" android:duration="150" />
 </animation-list> 

début du code

progress.setVisibility(View.VISIBLE);
AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
frameAnimation.setCallback(progress);
frameAnimation.setVisible(true, true);

arrêt du code

AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
frameAnimation.stop();
frameAnimation.setCallback(null);
frameAnimation = null;
progress.setVisibility(View.GONE);

plus aquí

5voto

Andrew Points 1675

A l'intérieur de l'élément mis :

android:repeatCount="infinite"

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