Je dois arrêter une animation de traduction en cours d'exécution. La méthode .cancel()
de Animation
n'a pas d'effet; l'animation va jusqu'au bout quand même.
Comment annuler une animation en cours?
Appelez clearAnimation()
sur l'un des View
que vous avez appelé startAnimation()
.
Sur Android 4.4.4, il semble que la seule façon de pouvoir arrêter une animation en fondu alpha sur une vue appelait View.animate().cancel()
(c.-à-d. En appelant .cancel()
sur la vue ViewPropertyAnimator
).
Voici le code que j'utilise pour la compatibilité avant et après ICS:
public void stopAnimation(View v) {
v.clearAnimation();
if (canCancelAnimation()) {
v.animate().cancel();
}
}
... avec la méthode:
/**
* Returns true if the API level supports canceling existing animations via the
* ViewPropertyAnimator, and false if it does not
* @return true if the API level supports canceling existing animations via the
* ViewPropertyAnimator, and false if it does not
*/
public static boolean canCancelAnimation() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
}
Voici l'animation que je m'arrête:
v.setAlpha(0f);
v.setVisibility(View.VISIBLE);
// Animate the content view to 100% opacity, and clear any animation listener set on the view.
v.animate()
.alpha(1f)
.setDuration(animationDuration)
.setListener(null);
Si vous utilisez l'écouteur d'animation, définissez v.setAnimationListener(null)
. Utilisez le code suivant avec toutes les options.
v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);
Vous devez utiliser .clearAnimation (); méthode dans le fil de l'interface utilisateur:
runOnUiThread(new Runnable() {
@Override
public void run() {
v.clearAnimation();
}
});
Ce que vous pouvez essayer de faire, c'est d'extraire la matrice de transformation de l'animation avant de l'arrêter et d'inspecter le contenu de la matrice pour obtenir les valeurs de position que vous recherchez.
Voici les api que vous devriez examiner
public boolean getTransformation (long currentTime, Transformation outTransformation)
public void getValues (float[] values)
Donc, par exemple (un pseudo code. Je n’ai pas testé cela):
Transformation outTransformation = new Transformation();
myAnimation.getTransformation(currentTime, outTransformation);
Matrix transformationMatrix = outTransformation.getMatrix();
float[] matrixValues = new float[9];
transformationMatrix.getValues(matrixValues);
float transX = matrixValues[Matrix.MTRANS_X];
float transY = matrixValues[Matrix.MTRANS_Y];
Utilisez la méthode setAnimation (null) pour arrêter une animation, elle est exposée comme méthode publique dans View.Java, il s'agit de la classe de base pour tous widgets, utilisés pour créer des composants d'interface utilisateur interactifs (boutons, champs de texte, etc.). /** * Sets the next animation to play for this view. * If you want the animation to play immediately, use * {@link #startAnimation(Android.view.animation.Animation)} instead. * This method provides allows fine-grained * control over the start time and invalidation, but you * must make sure that 1) the animation has a start time set, and * 2) the view's parent (which controls animations on its children) * will be invalidated when the animation is supposed to * start. * * @param animation The next animation, or null. */ public void setAnimation(Animation animation)
Pour arrêter l'animation, vous pouvez définir un objet commeAnimator qui ne fait rien, par exemple.
d’abord quand on bascule manuellement il ya une animation de gauche à droite:
flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);
puis, lors du passage au retournement automatique, il n'y a pas d'animation
flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);
doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);