web-dev-qa-db-fra.com

Android ImageView Animation

J'ai créé une mise en page avec une vue d'image et une vue Web. La vue Web est définie pour avoir une visibilité par défaut ou disparue. Lorsque l'activité démarre, la vue d'image est affichée en premier. Lorsque la vue Web a fini de charger son URL, elle se marque comme visible et la vue d'image est marquée comme masquée.

Lorsque l’imageview est affichée, je voudrais qu’elle tourne plusieurs fois pour obtenir un peu plus de pizza.

Je n'avais jamais fait d'animations auparavant dans Android et tous les messages que j'ai trouvés lorsque j'ai demandé à Internet n'étaient pas utiles; j'ai donc retourné à SO pour obtenir de l'aide .

Donc si je commence par ça ...

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

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

Merci encore!

60
cakeforcerberus

Utilisez un RotateAnimation , en définissant le point de pivotement 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);
102
Christopher Orr

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, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 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 entraînera une rotation de l'image autour de son centre (0,5 ou 50% de sa largeur/hauteur). Je l’affiche pour les futurs lecteurs qui viennent ici de Google, comme moi, et qui souhaitent faire pivoter l’image autour de son centre sans définir ce centre en pixels absolus.

50
Matt

Vous pouvez également simplement utiliser la fonctionnalité d'animation Rotation. Cela exécute une animation spécifique, pour une durée prédéterminée, sur un 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é Rotation_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>

Malheureusement, cela ne fonctionnera qu'une fois. Vous aurez besoin d'une boucle quelque part pour lui faire répéter l'animation en attendant. J'ai expérimenté un peu et mon programme a été bloqué dans des boucles infinies, alors je ne suis pas sûr de la meilleure façon de le faire. EDIT: La réponse de Christopher fournit des informations sur la manière de le faire en boucle correctement. Supprimez donc ma mauvaise suggestion concernant des threads séparés!

24
Steve Haley

One way - divisez votre image en N en la faisant légèrement tourner à chaque fois. Je dirais que 5 est suffisant. puis créer quelque chose comme ça en 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 ici

11
Alex Volovoy
imgDics = (ImageView) v.findViewById(R.id.img_player_tab2_dics);
    imgDics.setOnClickListener(onPlayer2Click);
    anim = new RotateAnimation(0f, 360f,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
                            0.5f);
    anim.setInterpolator(new LinearInterpolator());
    anim.setRepeatCount(Animation.INFINITE);
    anim.setDuration(4000);

    // Start animating the image
    imgDics.startAnimation(anim);
7
son nt

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

Android:repeatCount="infinite"
5
Andrew Mackenzie

J'ai découvert que si vous utilisez .getWidth/2 etc ... que cela ne fonctionnera pas, vous devez obtenir le nombre de pixels de l'image, la diviser par 2 vous-même, puis taper le nombre correspondant à l'image. 2 derniers arguments.

alors disons que votre image est un carré de 120 pixels par 120 pixels, ur x et y équivaut à 60 pixels. donc dans votre code, vous auriez raison:

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

et maintenant votre image va pivoter autour de son centre.

3
simply_immense

Code vérifié:

imageView.setImageResource(R.drawable.ic_arrow_up);

boolean up = true;

if (!up) { 
    up = true; 
    imageView.startAnimation(animate(up)); 
} else { 
    up = false; 
    imageView.startAnimation(animate(up)); 
}

private Animation animate(boolean up) {
    Animation anim = AnimationUtils.loadAnimation(this, up ? R.anim.rotate_up : R.anim.rotate_down);
    anim.setInterpolator(new LinearInterpolator()); // for smooth animation
    return anim;
}

drawable/ic_arrow_up.xml

<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:width="24dp"
        Android:height="24dp"
        Android:viewportWidth="24.0"
        Android:viewportHeight="24.0">
    <path
        Android:fillColor="#3d3d3d"
        Android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"/>
</vector>

anim/rotate_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fillAfter="true"
    Android:fillEnabled="true">
    <rotate
        Android:duration="200"
        Android:fromDegrees="-180"
        Android:pivotX="50%"
        Android:pivotY="50%"
        Android:toDegrees="0" />
</set>

anim/rotate_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fillAfter="true"
    Android:fillEnabled="true">
    <rotate
        Android:duration="200"
        Android:fromDegrees="0"
        Android:pivotX="50%"
        Android:pivotY="50%"
        Android:toDegrees="180" />
</set>
2
Ahamadullah Saikat

Ne codez pas les limites de l'image. Il suffit d'utiliser:

RotateAnimation anim = new RotateAnimation( fromAngle, toAngle, imageView.getDrawable().getBounds().width()/2, imageView.getDrawable().getBounds().height()/2);
0
nick shp