End animation event android

AndroidAndroid FragmentsAndroid Animation

Android Problem Overview


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?

Android Solutions


Solution 1 - Android

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

Solution 2 - Android

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

Solution 3 - Android

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**


			}
		});

Solution 4 - Android

You can also achieve this using Animation.setFillAfter

Solution 5 - Android

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

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
QuestionPaulo BarrosView Question on Stackoverflow
Solution 1 - Androidblessanm86View Answer on Stackoverflow
Solution 2 - AndroidAntziView Answer on Stackoverflow
Solution 3 - AndroidGaurav AroraView Answer on Stackoverflow
Solution 4 - AndroidPavanView Answer on Stackoverflow
Solution 5 - AndroidrichcView Answer on Stackoverflow