2011-09-01 16 views
37

Ho un ImageView che utilizzo per mostrare lo stato di avanzamento tramite AnimationDrawable. Quando voglio mostrare il mio progresso filatrice, faccio questo:Come faccio qualcosa quando termina un'animazione?

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

Quando voglio nascondere la filatrice, faccio questo:

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

Tuttavia, questo ha l'effetto che l'animazione si ferma subito . Mi piacerebbe che si fermasse solo dopo che lo ObjectAnimator è completamente sbiadito a 0,0 alfa. C'è un modo per impostare qualcosa sulla falsariga di un callback "AnimationCompleted"?

+0

non potevi dormire il filo per tutta la durata, quindi chiama .stop()? – Rob

+0

Preferisco non dormire il thread dell'interfaccia utente. Potrei eseguire un Runnable post-inoltrato(), ma sembra molto hacky. Sospetto che ci sia un modo corretto per farlo. Inoltre, non sono sicuro di quanto sia accurata l'intera durata. –

+0

Si può avere il runnable controllare l'alpha ad un intervallo soddisfacente –

risposta

30

Il modo più moderno di fare questo è quello di utilizzare il ViewPropertyAnimator:

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

Oppure, se si sta utilizzando RetroLambda:

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

davvero utile, grazie! – Alex

3

alla tua domanda iniziale circa l'ObjectAnimator oggetto è possibile configurare un oggetto Animator.AnimatorListener che definisce diversi callback dello stato di animazione. Si vuole ignorare pubblico onAnimationEnd vuoto (animazione Animator)

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

       } 
      }); 
Problemi correlati