Fine evento di animazione Android


90

Ho un'animazione di dissolvenza in una vista (che si trova all'interno di un frammento) e ogni volta che l'animazione si verifica, dopo che è terminata la vista si ridisegna di nuovo. Ho trovato un lavoro da fare view.SetVisibility(View.GONE). Ma non aspetta che l'animazione finisca. Vorrei eseguire questo codice setVisibility solo dopo che l'animazione è terminata. Qual è il modo migliore per farlo?


Pubblica il tuo codice come stai mostrando l'animazione ....
Lalit Poptani

Risposte:


171

Puoi aggiungere un listener di animazione al tuo oggetto di animazione come

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

5
Se si desidera impedire che l'animazione di dissolvenza si riavvii mentre l'animazione è in corso, utilizzare if (!anim.hasStarted() || anim.hasEnded())per rilevare se l'animazione è ancora in esecuzione.
theeczechsensation

34

Funzionalmente uguale alla risposta accettata ma in modo molto più conciso:

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

Godere :)


2
Trasparente e monostrato. Ottima risposta! Può essere semplicemente modificato con l'uso di lambda.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger

2
Tieni presente che questo è il livello API 16 (4.1) e superiore.
Tommie

Soluzione fantastica, amico mio. Grazie!
Vlad Ivchenko

Informazioni importanti: - L'azione viene eseguita solo se l'animazione termina normalmente, se ViewPropertyAnimator viene annullato durante l'animazione, il eseguibile non verrà eseguito.
Sarthak_ssg5

Funziona come un incantesimo, anche quando si utilizza il componente di navigazione nel runnable. (L'ascoltatore di animazione si è sempre bloccato durante la navigazione con il componente di navigazione.)
Luigi_Papardelle


9

Prendi semplicemente il tuo oggetto di animazione e aggiungi ad esso un ascoltatore di animazione. Ecco il codice di esempio:

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

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

potresti salvare alcune righe usandofade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.