101

I have a fadeout animation in a view (which is inside a fragment), and everytime the animation happens, after it finishes the view redraws itself again. I found a work around doing view.SetVisibility(View.GONE) . But it doesn't wait for the animation to finish. I would like to execute this setVisibility code only after the animation has finished. What is the best way to do that?

Paulo Barros
  • 2,740
  • 8
  • 28
  • 36

5 Answers5

189

You can add Animation listener to your animation object like

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});
blessanm86
  • 31,439
  • 14
  • 68
  • 79
  • 5
    If you want to prevent the fadeout animation to start again while the animation is in progress, use `if (!anim.hasStarted() || anim.hasEnded())` to detect if the animation is still running. – theczechsensation Dec 28 '14 at 06:29
48

Functionally the same as the accepted answer but in a much more concise way:

// Add/Remove any animation parameter
theView.animate()
        .alpha(0)
        .setDuration(2000)
        .withEndAction(new Runnable() {
            @Override
            public void run() {
                theView.setVisibility(View.GONE);
            }
        });

Enjoy :)

Son Truong
  • 13,661
  • 5
  • 32
  • 58
Antzi
  • 12,831
  • 7
  • 48
  • 74
10

Simply take your animation object and add animation listener to it. Here is the example code :

rotateAnimation.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // TODO Auto-generated method stub

**// WRITE HERE WHATEVER YOU WANT ON THE COMPLETION OF THE ANIMATION**


            }
        });
Gaurav Arora
  • 8,282
  • 21
  • 88
  • 143
9

You can also achieve this using Animation.setFillAfter

Pavan
  • 711
  • 2
  • 6
  • 17
5

Example for Kotlin

var fadeOutImage = findViewById<ImageView>(R.id.fade_out_Image)
    val fadeOutAnimation = R.anim.fade_out_animation
    val animation = AnimationUtils.loadAnimation(this, fadeOutAnimation)
    fadeOutImage.startAnimation(animation)

    animation.setAnimationListener(object : Animation.AnimationListener {
        override fun onAnimationStart(p0: Animation?) {
//                not implemented
        }

        override fun onAnimationRepeat(p0: Animation?) {
//                not implemented
        }

        override fun onAnimationEnd(p0: Animation?) {
            fadeOutImage.visibility = View.INVISIBLE
        }
    })
richc
  • 1,648
  • 5
  • 20
  • 48
  • you might save some lines using `fade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()` – longi Jul 18 '19 at 10:28
  • Comment : it is mandatory use fadeOutImage.startAnimation(animation) and not fadeOutImage = animation – Dimitri Leurs May 12 '22 at 10:18