web-dev-qa-db-fra.com

Comment arrêter une animation (cancel () ne fonctionne pas)

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?

220
Mix

Appelez clearAnimation() sur l'un des View que vous avez appelé startAnimation().

471
CommonsWare

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);
35
Sean Barbeau

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);
18
DjP

Vous devez utiliser .clearAnimation (); méthode dans le fil de l'interface utilisateur:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        v.clearAnimation();
    }
});
4
rz0

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 Matrix getMatrix ()

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];
3
Akos Cz

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)

0
saurabh dhillon

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);
0
Andrew Glukhoff