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!
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);
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.
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!
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
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);
À l'intérieur de l'élément mis:
Android:repeatCount="infinite"
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.
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>
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);