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,720
  • 8
  • 27
  • 36

5 Answers5

187

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
  • 30,847
  • 14
  • 65
  • 77
  • 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
  • 12,343
  • 5
  • 28
  • 54
Antzi
  • 12,325
  • 6
  • 44
  • 72
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,092
  • 20
  • 85
  • 136
9

You can also achieve this using Animation.setFillAfter

Pavan
  • 691
  • 1
  • 6
  • 16
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,596
  • 4
  • 18
  • 45
  • 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