102 votes

Événement de fin d'animation Android

J'ai une animation en fondu enchaîné dans une vue (qui est à l'intérieur d'un fragment), et à chaque fois que l'animation se produit, après qu'elle se termine, la vue se redessine à nouveau. J'ai trouvé un moyen de contourner le problème en faisant view.SetVisibility(View.GONE) . Mais il n'attend pas que l'animation soit terminée. Je voudrais exécuter ce code setVisibility uniquement après la fin de l'animation. Quelle est la meilleure façon de procéder ?

0 votes

Affichez votre code pour montrer l'animation.....

190voto

blessenm Points 14700

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

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});

5 votes

Si vous voulez empêcher l'animation du fondu enchaîné de recommencer pendant que l'animation est en cours, utilisez if (!anim.hasStarted() || anim.hasEnded()) pour détecter si l'animation est toujours en cours.

48voto

Antzi Points 1251

Fonctionnement identique à celui de la réponse acceptée, mais de 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);
            }
        });

Profitez-en :)

4 votes

Clair et sans détour. Réponse optimale ! Peut être simplifié avec l'utilisation de lambda .withEndAction(() -> theView.setVisibility(View.GONE));

2 votes

N'oubliez pas qu'il s'agit du niveau 16 (4.1) de l'API et des niveaux supérieurs.

0 votes

Une solution étonnante, mon ami. Merci !

10voto

Gaurav Arora Points 2134

Il suffit de prendre votre objet d'animation et d'y ajouter 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**

            }
        });

9voto

Pavan Points 303

Vous pouvez également y parvenir en utilisant Animation.setFillAfter

7voto

richc Points 580

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

0 votes

Vous pouvez économiser quelques lignes en utilisant fade_out_Image.animate().alpha(0f).setDuration(100L).withEnd‌​Action {fade_out_Image.visibility = View.GONE}.start()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X