Zakończ wydarzenie animacji android

90

W widoku mam animację zanikania (która znajduje się wewnątrz fragmentu) i za każdym razem, gdy animacja się dzieje, po jej zakończeniu widok ponownie rysuje się od nowa. Znalazłem pracę view.SetVisibility(View.GONE). Ale to nie czeka na zakończenie animacji. Chciałbym wykonać ten kod setVisibility dopiero po zakończeniu animacji. Jaki jest najlepszy sposób, aby to zrobić?

Paulo Barros
źródło
Opublikuj swój kod, jak chcesz pokazać animację ....
Lalit Poptani,

Odpowiedzi:

175

Możesz dodać odbiornik animacji do obiektu animacji, na przykład

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});
blessenm
źródło
5
Jeśli chcesz zapobiec ponownemu uruchamianiu animacji zanikania w trakcie trwania animacji, użyj opcji, if (!anim.hasStarted() || anim.hasEnded())aby wykryć, czy animacja nadal jest uruchomiona.
theczechsensation
36

Funkcjonalnie to samo, co przyjęta odpowiedź, ale w dużo bardziej zwięzły sposób:

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

Cieszyć się :)

Antzi
źródło
3
Przezroczysta i jednowarstwowa. Najlepsza odpowiedź! Można to uprościć za pomocą lambdy.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger
2
Należy pamiętać, że jest to poziom interfejsu API 16 (4.1) i wyższy.
Tommie
Niesamowite rozwiązanie, przyjacielu. Dziękuję Ci!
Vlad Ivchenko
Ważna informacja: - Akcja jest uruchamiana tylko wtedy, gdy animacja zakończy się normalnie, jeśli ViewPropertyAnimator zostanie anulowane podczas tej animacji, plik runnable nie zostanie uruchomiony.
Sarthak_ssg5
1
Działa jak urok, także podczas korzystania z komponentu nawigacyjnego w programie uruchamiającym. (Słuchacz animacji zawsze się zawieszał, kiedy nawigowałem z komponentem nawigacyjnym.)
Luigi_Papardelle
9

Po prostu weź obiekt animacji i dodaj do niego odbiornik animacji. Oto przykładowy kod:

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
źródło
1

Przykład dla Kotlina

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
źródło
możesz zapisać niektóre linie za pomocąfade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi