我经常使用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只执行一次,可能会多次调用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); }