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?


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

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


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


            }
        });

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

Sie könnten einige Zeilen mitfade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.