Fin de l'événement d'animation Android

90

J'ai une animation de fondu dans une vue (qui est à l'intérieur d'un fragment), et chaque fois que l'animation se produit, une fois qu'elle est terminée, la vue se redessine. J'ai trouvé un travail autour de faire view.SetVisibility(View.GONE). Mais il n'attend pas la fin de l'animation. Je souhaite exécuter ce code setVisibility uniquement après la fin de l'animation. Quelle est la meilleure façon de le faire?

Paulo Barros
la source
Postez votre code comment vous montrez l'animation ....
Lalit Poptani

Réponses:

171

Vous pouvez ajouter un écouteur d'animation à votre objet d'animation comme

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});
bénédiction
la source
5
Si vous souhaitez empêcher l'animation de fondu de redémarrer pendant que l'animation est en cours, utilisez if (!anim.hasStarted() || anim.hasEnded())pour détecter si l'animation est toujours en cours d'exécution.
theczechsensation
34

Fonctionnellement identique à la réponse acceptée mais d'une manière beaucoup plus concise:

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

Prendre plaisir :)

Antzi
la source
2
Clair et une doublure. Top réponse! Peut être simplementfié avec l'utilisation de lambda.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger
2
Gardez à l'esprit qu'il s'agit du niveau d'API 16 (4.1) et supérieur.
Tommie
Solution incroyable, mon ami. Je vous remercie!
Vlad Ivchenko
Information importante: - L'action n'est exécutée que si l'animation se termine normalement, si le ViewPropertyAnimator est annulé pendant cette animation, l'exécutable ne fonctionnera pas.
Sarthak_ssg5
Fonctionne comme un charme, également lors de l'utilisation du composant de navigation dans le runnable. (L'auditeur d'animation s'est toujours écrasé lorsque je naviguais avec le composant de navigation.)
Luigi_Papardelle
9

Prenez simplement votre objet d'animation et ajoutez-y un écouteur d'animation. Voici l'exemple de 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
la source
1

Exemple pour 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
la source
vous pouvez enregistrer quelques lignes en utilisantfade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi