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?


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

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


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


            }
        });

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

puede guardar algunas líneas usandofade_out_Image.animate().alpha(0f).setDuration(100L).withEndAction {fade_out_Image.visibility = View.GONE}.start()
longi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.