How to stop an animation (cancel() does not work)

AndroidAnimation

Android Problem Overview


I need to stop a running translate animation. The .cancel() method of Animation has no effect; the animation goes until the end anyway.

How do you cancel a running animation?

Android Solutions


Solution 1 - Android

Call clearAnimation() on whichever View you called startAnimation().

Solution 2 - Android

On Android 4.4.4, it seems the only way I could stop an alpha fading animation on a View was calling View.animate().cancel() (i.e., calling .cancel() on the View's ViewPropertyAnimator).

Here's the code I'm using for compatibility before and after ICS:

public void stopAnimation(View v) {
    v.clearAnimation();
    if (canCancelAnimation()) {
        v.animate().cancel();
    }
}

... with the method:

/**
 * 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;
}

Here's the animation that I'm stopping:

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

Solution 3 - Android

If you are using the animation listener, set v.setAnimationListener(null). Use the following code with all options.

v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);

Solution 4 - Android

You must use .clearAnimation(); method in UI thread:

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

Solution 5 - Android

What you can try to do is get the transformation Matrix from the animation before you stop it and inspect the Matrix contents to get the position values you are looking for.

Here are the api's you should look into

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix ()

public void getValues (float[] values)

So for example (some pseudo code. I have not tested this):

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];

Solution 6 - Android

Use the method setAnimation(null) to stop an animation, it exposed as public method in View.java, it is the base class for all widgets, which are used to create interactive UI components (buttons, text fields, 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)

Solution 7 - Android

To stop animation you may set such objectAnimator that do nothing, e.g.

first when manual flipping there is animation left to right:

flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);

then when switching to auto flipping there's no animation

flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);

Solution 8 - Android

First of all, remove all the listeners which are related to the animatior or animator set. Then cancel the animator or animator set.

 inwardAnimationSet.removeAllListeners()
        inwardAnimationSet.cancel()

Solution 9 - Android

use this way:

// start animation
TranslateAnimation anim = new TranslateAnimation( 0, 100 , 0, 100);
anim.setDuration(1000);
anim.setFillAfter( true );
view.startAnimation(anim);

// end animation or cancel that
view.getAnimation().cancel();
view.clearAnimation();

cancel()

Cancel the animation. Canceling an animation invokes the animation listener, if set, to notify the end of the animation. If you cancel an animation manually, you must call reset() before starting the animation again.


clearAnimation()

Cancels any animations for this view.


Solution 10 - Android

After going through all the things nothing worked. As I applied multiple animations in my views. So below is the code that worked for me. To start the animation that fades in and fade out continuously

val mAnimationSet = AnimatorSet()
private fun performFadeAnimation() {
    val fadeOut: ObjectAnimator = ObjectAnimator.ofFloat(clScanPage, "alpha", 1f, 0f)
    fadeOut.duration = 1000
    val fadeIn: ObjectAnimator = ObjectAnimator.ofFloat(clScanPage, "alpha", 0f, 1f)
    fadeIn.duration = 1000
    mAnimationSet.play(fadeIn).after(fadeOut)
    mAnimationSet.addListener(animationListener)
    mAnimationSet.start()
}

The animation listener that loops in continuously

 private val animationListener=object : AnimatorListenerAdapter() {
    override fun onAnimationEnd(animation: Animator?) {
        super.onAnimationEnd(animation)
        mAnimationSet.start()
    }
}

To stop the animation that going on in a loop. I did the following.

private fun stopAnimation() {
    mAnimationSet.removeAllListeners()
}

Solution 11 - Android

Since none of other answers mention it, you can easily stop an animation using ValueAnimator's cancel().

ValueAnimator is very powerful for making animations. Here is a sample code for creating a translation animation using ValueAnimator:

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 5f);

int mDuration = 5000; //in millis
valueAnimator.setDuration(mDuration);

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

   @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        // Update your view's x or y coordinate
    }
});

valueAnimator.start();

You then stop the animation by calling

valueAnimator.cancel()`

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMixView Question on Stackoverflow
Solution 1 - AndroidCommonsWareView Answer on Stackoverflow
Solution 2 - AndroidSean BarbeauView Answer on Stackoverflow
Solution 3 - AndroidDjPView Answer on Stackoverflow
Solution 4 - AndroidAleksandr GorshkovView Answer on Stackoverflow
Solution 5 - AndroidAkos CzView Answer on Stackoverflow
Solution 6 - Androidsaurabh dhillonView Answer on Stackoverflow
Solution 7 - AndroidAndrew GlukhoffView Answer on Stackoverflow
Solution 8 - AndroidSahil BansalView Answer on Stackoverflow
Solution 9 - AndroidRasoul MiriView Answer on Stackoverflow
Solution 10 - AndroidRoshan KumarView Answer on Stackoverflow
Solution 11 - AndroidmatdevView Answer on Stackoverflow