android animate() withEndAction() vs setListener() onAnimationEnd()

标签 android android-animation viewpropertyanimator

我经常使用 ViewPropertyAnimator 并使用它的 withEndAction() 函数设置结束 Action ,例如:

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

但您也可以设置结束 Action 设置特殊监听器,例如:

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

那么这两种方法有什么区别,什么时候应该使用它们呢?

最佳答案

没有太大区别,看看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);
}

关于android animate() withEndAction() vs setListener() onAnimationEnd(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34152421/

相关文章:

android - 当我在 user-interface-samples 项目中运行 Notifications 应用程序时,是什么原因导致 "java.lang.NullPointerException"错误?

java - 在第二个 Activity 中显示按钮CheckAnswer

android - 在 android 中触摸屏幕时会发光吗?

android - 无法删除 ViewPropertyAnimator 的监听器

android - 禁用保持屏幕开启

java - 解析套接字输入字符串

Android AnimatedVectorDrawable - 属性 : is not supported for FullPath

java - 加载动画在前 ICS 设备上启动,但不会在后 ICS 设备上启动

android - 获取父布局的宽度