2015-12-08 16 views
8

Często używam ViewPropertyAnimator i ustawić akcję końcowy przy użyciu jego funkcji withEndAction() jak:android animate() withEndAction() vs setListener() onAnimationEnd()

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

Ale również można ustawić ustawienie specjalnego słuchacza działania końcową na przykład:

view.animate().translationY(0).setListener(new AnimatorListenerAdapter() { 
    @Override 
    public void onAnimationEnd(Animator animation) { 
     // do something 
    } 
}); 

Jaka jest różnica między tymi dwoma podejściami i kiedy powinienem użyć każdego z nich?

Odpowiedz

11

Nie ma dużej różnicy, spójrz na souce code.

Oba są wykonywane na onAnimationEnd.

Ale operacja zostanie usunięta po uruchomieniu. Więc Runnable jest wykonywane tylko raz, a Listener może zostać wywołany wiele razy.

@Override 
public void onAnimationEnd(Animator animation) { 
    mView.setHasTransientState(false); 
    if (mListener != null) { 
     mListener.onAnimationEnd(animation); // this is your listener 
    } 
    if (mAnimatorOnEndMap != null) { 
     Runnable r = mAnimatorOnEndMap.get(animation); // this is your runnable 
     if (r != null) { 
      r.run(); 
     } 
      mAnimatorOnEndMap.remove(animation); 
    } 
    if (mAnimatorCleanupMap != null) { 
     Runnable r = mAnimatorCleanupMap.get(animation); 
     if (r != null) { 
      r.run(); 
     } 
     mAnimatorCleanupMap.remove(animation); 
    } 
    mAnimatorMap.remove(animation); 
} 
+0

Teraz jest dla mnie jasne. Wielkie dzięki –

+2

Bez problemu. Mam nadzieję, że zdobędziesz więcej punktów. Moim zdaniem było to dość ciekawe pytanie. :) – FlanschiFox