Animationsereignis beenden Android

90

Ich habe eine Ausblendanimation in einer Ansicht (die sich in einem Fragment befindet), und jedes Mal, wenn die Animation ausgeführt wird, zeichnet sich die Ansicht nach Abschluss erneut aus. Ich habe eine Arbeit gefunden view.SetVisibility(View.GONE). Es wartet jedoch nicht darauf, dass die Animation beendet ist. Ich möchte diesen setVisibility-Code erst ausführen, nachdem die Animation beendet ist. Was ist der beste Weg das zu tun?

Paulo Barros
quelle
Veröffentlichen Sie Ihren Code, wie Sie die Animation zeigen ....
Lalit Poptani

Antworten:

170

Sie können Ihrem Animationsobjekt wie folgt einen Animationslistener hinzufügen

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});
blessenm
quelle
5
Wenn Sie verhindern möchten, dass die Ausblendanimation während der Animation erneut gestartet wird, können Sie if (!anim.hasStarted() || anim.hasEnded())mit feststellen, ob die Animation noch ausgeführt wird.
Theczechsensation
34

Funktionell identisch mit der akzeptierten Antwort, jedoch viel prägnanter:

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

Genießen :)

Antzi
quelle
2
Klar und einzeilig. Top Antwort! Kann mit der Verwendung von Lambda.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger
2
Beachten Sie, dass dies API-Level 16 (4.1) und höher ist.
Tommie
Erstaunliche Lösung, mein Freund. Danke dir!
Vlad
Wichtige Informationen: - Die Aktion wird nur ausgeführt, wenn die Animation normal endet. Wenn der ViewPropertyAnimator während dieser Animation abgebrochen wird, wird die ausführbare Datei nicht ausgeführt.
Sarthak_ssg5
Funktioniert wie ein Zauber, auch wenn die Navigationskomponente in der ausführbaren Datei verwendet wird. (Der Animations-Listener stürzte immer ab, als ich mit der Navigationskomponente navigierte.)
Luigi_Papardelle
9

Nehmen Sie einfach Ihr Animationsobjekt und fügen Sie ihm einen Animationslistener hinzu. Hier ist der Beispielcode:

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
quelle
1

Beispiel für 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
quelle
Sie könnten einige Zeilen mitfade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi