2015-12-08 58 views
8

我經常使用ViewPropertyAnimator並設置結束動作使用其withEndAction()函數,如:機器人動畫()withEndAction()VS setListener()onAnimationEnd()

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

而且還可以設置結束動作設置特殊的監聽器像:

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

那麼這兩種方法之間的區別是什麼,我應該使用它們中的每一種?

回答

11

沒有什麼大的區別,看看souce code

兩者都在onAnimationEnd上執行。

但runnable在啓動後被刪除。 所以Runnable只執行一次,而Listener可能會被多次調用。

@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

現在很清楚。非常感謝 –

+2

沒問題。我希望你能得到更多讚揚。在我的選擇中,這是一個非常有趣的問題。 :) – FlanschiFox