Finalizar evento de animación android

90

Tengo una animación de desvanecimiento en una vista (que está dentro de un fragmento), y cada vez que ocurre la animación, después de que termina, la vista se vuelve a dibujar. Encontré un trabajo por hacer view.SetVisibility(View.GONE). Pero no espera a que termine la animación. Me gustaría ejecutar este código setVisibility solo después de que la animación haya terminado. ¿Cuál es la mejor forma de hacerlo?

Paulo Barros
fuente
Publique su código de cómo está mostrando la animación ....
Lalit Poptani

Respuestas:

171

Puede agregar un oyente de animación a su objeto de animación como

anim.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation arg0) {
    }           
    @Override
    public void onAnimationRepeat(Animation arg0) {
    }           
    @Override
    public void onAnimationEnd(Animation arg0) {
    }
});
bendición
fuente
5
Si desea evitar que la animación de desvanecimiento comience de nuevo mientras la animación está en progreso, use if (!anim.hasStarted() || anim.hasEnded())para detectar si la animación aún se está ejecutando.
theczechsensation
34

Funcionalmente igual que la respuesta aceptada pero de una manera mucho más concisa:

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

Disfruta :)

Antzi
fuente
2
Transparente y de una sola línea. ¡Respuesta superior! Se puede simplificar con el uso de lambda.withEndAction(() -> theView.setVisibility(View.GONE));
theBugger
2
Tenga en cuenta que este es el nivel de API 16 (4.1) y superior.
Tommie
Increíble solución, amigo. ¡Gracias!
Vlad Ivchenko
Información importante: - La acción solo se ejecuta si la animación finaliza normalmente, si ViewPropertyAnimator se cancela durante esa animación, el ejecutable no se ejecutará.
Sarthak_ssg5
Funciona como un encanto, también cuando se usa el componente de navegación en el ejecutable. (El oyente de animación siempre se bloqueaba cuando navegaba con el componente de navegación).
Luigi_Papardelle
9

Simplemente tome su objeto de animación y agréguele un oyente de animación. Aquí está el código de ejemplo:

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

Ejemplo para 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
fuente
puede guardar algunas líneas usandofade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi