2011-09-01 16 views
37

Tengo un ImageView que uso para mostrar el progreso a través de AnimationDrawable. Cuando quiero mostrar mi progreso spinner, hago esto:¿Cómo hago algo cuando termina una animación?

animDrawable.start(); 
ObjectAnimator.ofFloat(view, "alpha", 1.0f).setDuration(300).start(); 

cuando quiero ocultar el spinner, hago esto:

ObjectAnimator.ofFloat(view, "alpha", 0.0f).setDuration(300).start(); 
animDrawable.stop(); 

Sin embargo, esto tiene el efecto de que la animación se detiene inmediatamente . Me gustaría que se detenga solo después de que el ObjectAnimator se haya desvanecido por completo a 0.0 alfa. ¿Hay alguna manera de configurar algo similar a una devolución de llamada "AnimationCompleted"?

+0

No se pudo dormir que el hilo de la duración, luego llama a .stop()? – Rob

+0

Preferiría no dormir el hilo de UI. Podría hacer un PostDelayed() Runnable, pero eso parece muy hacky. Sospecho que hay una forma correcta de hacer esto. Además, no estoy seguro de cuán precisa es la duración total. –

+0

Puede hacer que el ejecutable verifique el alfa en un intervalo satisfactorio –

Respuesta

30

La forma más moderna de hacer esto es utilizar el ViewPropertyAnimator:

view.animate() 
    .alpha(0f) 
    .withEndAction(new Runnable() { 
     @Override 
     public void run() { 
     // Do something. 
     } 
    }) 
    .start(); 

O, si usted está utilizando RetroLambda:

view.animate() 
    .alpha(0f) 
    .withEndAction(() -> { 
     // Do something. 
    }) 
    .start(); 
+0

realmente útil, gracias! – Alex

3

Para su pregunta original sobre la ObjectAnimator objeto Puede configura un objeto Animator.AnimatorListener que define varias devoluciones de llamada de estados de animación. Desea anular public void onAnimationEnd (animación animador)

animation.addListener(new Animator.AnimatorListener() { 
       @Override 
       public void onAnimationStart(Animator animation) { 

       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 
        Toast.makeText(VideoEditorActivity.this, "animation ended", Toast.LENGTH_LONG).show(); 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 

       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 

       } 
      }); 
Cuestiones relacionadas