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?


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

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


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


            }
        });

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

vous pouvez enregistrer quelques lignes en utilisantfade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.