android animate()withEndAction()与AnimationEnd()上的setListener()比较

android animate()withEndAction()与AnimationEnd()上的setListener()比较,android,android-animation,viewpropertyanimator,Android,Android Animation,Viewpropertyanimator,我经常使用ViewPropertyAnimator,并使用其withEndAction()函数设置结束操作,如: view.animate().translationY(0).withEndAction(new Runnable() { @Override public void run() { // do something } }).start(); 但您也可以设置结束动作设置特殊侦听器,如: view.animate().translationY(

我经常使用ViewPropertyAnimator,并使用其withEndAction()函数设置结束操作,如:

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
    }
});

那么,这两种方法之间的区别是什么,我应该在什么时候使用它们呢?

没有大的区别,看看下面的例子

这两个命令都在onAnimationEnd上执行

但是runnable在启动后被删除。 因此Runnable只执行一次,侦听器可能被调用多次

@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);
}

没问题。我希望你能得到更多的选票。在我看来,这是一个非常有趣的问题