J'utilise un RotateAnimation
pour faire pivoter une image que j'utilise comme spinner cyclique personnalisé dans Android. Voici mon rotate_indefinitely.xml
dossier, que j'ai placé dans res/anim/
:
<?xml version="1.0" encoding="UTF-8"?>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:duration="1200" />
Lorsque j'applique cela à mon ImageView
utilisation AndroidUtils.loadAnimation()
, cela fonctionne très bien!
spinner.startAnimation(
AnimationUtils.loadAnimation(activity, R.anim.rotate_indefinitely) );
Le seul problème est que la rotation de l'image semble s'arrêter en haut de chaque cycle.
En d'autres termes, l'image pivote à 360 degrés, s'arrête brièvement, puis pivote à nouveau à 360 degrés, etc.
Je soupçonne que le problème est que l'animation utilise un interpolateur par défaut comme android:iterpolator="@android:anim/accelerate_interpolator"
( AccelerateInterpolator
), mais je ne sais pas comment lui dire de ne pas interpoler l'animation.
Comment désactiver l'interpolation (si tel est bien le problème) pour fluidifier mon cycle d'animation?
J'ai également eu ce problème et j'ai essayé de définir l'interpolateur linéaire en XML sans succès. La solution qui a fonctionné pour moi a été de créer l'animation en tant que RotateAnimation dans le code.
la source
rotate.setFillAfter(true);
rotate.setRepeatCount(Animation.INFINITE);
Cela fonctionne bien
Pour inverser la rotation:
la source
Peut-être que quelque chose comme ça aidera:
Soit dit en passant, vous pouvez faire pivoter de plus de 360 comme:
la source
Essayez d'utiliser
toDegrees="359"
car 360 ° et 0 ° sont identiques.la source
Essaye ça.
la source
Objet de rotation par programmation.
// rotation horaire :
// Rotation anti-horaire:
La vue est l'objet de votre ImageView ou d'autres widgets.
Rotate.setRepeatCount (10); utilisez pour répéter votre rotation.
500 est la durée de votre animation.
la source
L'élagage de
<set>
-Element qui a enveloppé<rotate>
-Element résout le problème!Merci à Shalafi!
Votre Rotation_ccw.xml devrait donc ressembler à ceci:
la source
Peu importe ce que j'ai essayé, je n'ai pas pu faire fonctionner cela correctement en utilisant du code (et setRotation) pour une animation de rotation fluide. J'ai fini par faire des changements de degré si petits que les petites pauses sont imperceptibles. Si vous n'avez pas besoin de faire trop de rotations, le temps pour exécuter cette boucle est négligeable. L'effet est une rotation douce:
la source
Comme hanry l'a mentionné ci-dessus, mettre l'itérolateur de doublure est très bien. Mais si la rotation est à l'intérieur d'un ensemble, vous devez mettre android: shareInterpolator = "false" pour le rendre plus fluide.
Si Sharedinterpolator n'est pas faux, le code ci-dessus donne des problèmes.
la source
Si vous utilisez une animation d'ensemble comme moi, vous devez ajouter l'interpolation à l'intérieur de la balise d'ensemble:
Cela a fonctionné pour moi.
la source
À Kotlin:
la source
Est-il possible que parce que vous passez de 0 à 360, vous passez un peu plus de temps à 0/360 que ce que vous attendiez? Peut-être défini sur Degrés à 359 ou 358.
la source
Essayez d'utiliser plus de 360 pour éviter de redémarrer.
J'utilise 3600 insted de 360 et cela fonctionne très bien pour moi:
la source
Dans Android, si vous souhaitez animer un objet et le faire déplacer un objet de location1 à location2, l'API d'animation détermine les emplacements intermédiaires (interpolation), puis met en file d'attente sur le thread principal les opérations de déplacement appropriées aux moments appropriés à l'aide d'une minuterie . Cela fonctionne bien, sauf que le thread principal est généralement utilisé pour de nombreuses autres choses - peinture, ouverture de fichiers, réponse aux entrées de l'utilisateur, etc. Un temporisateur en file d'attente peut souvent être retardé. Les programmes bien écrits essaieront toujours de faire autant d'opérations que possible dans les threads d'arrière-plan (non principaux), mais vous ne pouvez pas toujours éviter d'utiliser le thread principal. Les opérations qui vous obligent à opérer sur un objet d'interface utilisateur doivent toujours être effectuées sur le thread principal. En outre, de nombreuses API redirigent les opérations vers le thread principal sous forme de sécurité des threads.
Les vues sont toutes dessinées sur le même thread GUI qui est également utilisé pour toutes les interactions utilisateur.
Donc, si vous devez mettre à jour rapidement l'interface graphique ou si le rendu prend trop de temps et affecte l'expérience utilisateur, utilisez SurfaceView.
Exemple d'image de rotation:
activité:
la source
la source