2015-12-08 14 views
8

Thông thường tôi sử dụng ViewPropertyAnimator và thiết lập hành động cuối sử dụng chức năng của nó withEndAction() như:Animate android() withEndAction() vs setListener() onAnimationEnd()

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

Nhưng bạn cũng có thể đặt cài đặt người nghe đặc biệt hành động cuối như:

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

Vậy sự khác biệt giữa hai cách tiếp cận này và khi nào tôi nên sử dụng mỗi phương pháp này?

Trả lời

11

Không có sự khác biệt lớn, hãy xem souce code.

Cả hai được thực hiện trên onAnimationEnd.

Nhưng runnable bị xóa sau khi bắt đầu. Vì vậy, Runnable chỉ được thực hiện một lần và người nghe có thể được gọi nhiều lần.

@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

Bây giờ điều đó rõ ràng đối với tôi. Cảm ơn rất nhiều –

+2

Không sao cả. Tôi hy vọng bạn nhận được một số upvotes hơn. Trong sự lựa chọn của tôi, đây là một câu hỏi khá thú vị. :) – FlanschiFox