i_am_jorf
i_am_jorf

Reputation: 54600

How do I do something when an animation finishes?

I have an ImageView that I use to show progress via an AnimationDrawable. When I want to show my progress spinner, I do this:

animDrawable.start();
ObjectAnimator.ofFloat(view, "alpha", 1.0f).setDuration(300).start();

When I want to hide the spinner, I do this:

ObjectAnimator.ofFloat(view, "alpha", 0.0f).setDuration(300).start();
animDrawable.stop();

However, this has the effect that the animation stops immediately. I would like it to stop only after the ObjectAnimator has completely faded to 0.0 alpha. Is there a way I can setup something along the lines of an "AnimationCompleted" callback?

Upvotes: 58

Views: 45116

Answers (5)

Holy Father
Holy Father

Reputation: 1

You can use this code with Object animator on Kotlin

ObjectAnimator.ofInt(
                view,
                "alpha",
                1.0f
            ).apply {
                duration = 300
                // some other params here
                doOnEnd { // your logic when the animation ended }
                start()
            }

Upvotes: 0

Ajay
Ajay

Reputation: 4926

With androidx you can use doOnEnd method which invoked when the animation has ended

val anim = ObjectAnimator.ofFloat(eva_image, View.TRANSLATION_Y, 0f, 500f)
anim.setDuration(500)
anim.doOnEnd { Toast.makeText(this, "Anim End", Toast.LENGTH_SHORT).show() }
anim.start()

Upvotes: 11

ProjectDelta
ProjectDelta

Reputation: 878

You could also look into postOnAnimation(Runnable)

Link to Docs: postOnAnimation(java.lang.Runnable)

Upvotes: 1

Aaron Dancygier
Aaron Dancygier

Reputation: 1986

To your original question about the ObjectAnimator object you can set up an Animator.AnimatorListener object which defines several animation state callbacks. You want to override public void onAnimationEnd(Animator animation)

animation.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    Toast.makeText(VideoEditorActivity.this, "animation ended", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            });

Upvotes: 20

i_am_jorf
i_am_jorf

Reputation: 54600

The more modern way of doing this is to use the ViewPropertyAnimator:

view.animate()
    .alpha(0f)
    .withEndAction(new Runnable() {
      @Override
      public void run() {
        // Do something.
      }
    })
    .start();

Or, if you're using RetroLambda:

view.animate()
    .alpha(0f)
    .withEndAction(() -> {
      // Do something.
    })
    .start();

Upvotes: 53

Related Questions