2011-09-01 23 views
37

Mam ImageView, którego używam do pokazania postępu przez AnimationDrawable. Kiedy chcę pokazać moje postępy tarczy, mogę to zrobić:Jak mogę coś zrobić po zakończeniu animacji?

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

gdy chcę ukryć tarczy, mogę to zrobić:

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

to jednak powoduje, że animacja zatrzymuje się natychmiast . Chciałbym, aby zatrzymał się dopiero po tym, jak ObjectAnimator całkowicie zniknął do 0,0 alfa. Czy istnieje sposób, w jaki mogę skonfigurować coś podobnego do wywołania zwrotnego "AnimationCompleted"?

+0

nie można spać wątek na czas, następnie wywołać .stop()? – Rob

+0

Wolę nie przespać wątku interfejsu użytkownika. Mogę zrobić postDelayed() Runnable, ale to wydaje się bardzo hacky. Podejrzewam, że jest to właściwy sposób. Co więcej, nie jestem pewien, jak dokładna jest cała operacja. –

+0

Możesz mieć sprawne sprawdzanie alpha w satysfakcjonującym przedziale –

Odpowiedz

30

Im bardziej nowoczesny sposób to zrobić jest użycie ViewPropertyAnimator:

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

Lub, jeśli używasz RetroLambda:

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

bardzo pomocne, dzięki! – Alex

3

do pierwotnego pytania o ObjectAnimator obiektu można skonfiguruj obiekt Animator.AnimatorListener, który definiuje kilka zwrotów stanu animacji. Chcesz nadpisać public void onAnimationEnd (animacja 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) { 

       } 
      }); 
Powiązane problemy