根据文档http://developer.android.com/reference/android/animation/AnimatorSet.html#end() end()方法应该为集合中的所有动画分配结束值。但是,如果未启动集合,则结束不执行任何操作。这与ValueAnimator不同,即不关心并且人为地启动动画,触发onAnimationStart()事件然后结束它,这导致正确设置结束值。
让我告诉你为什么这是一个问题。如果您希望能够使用和不使用动画更新视图(具体取决于具体情况),您可能不希望有两种不同的方法。相反,您可以创建动画并正常启动它或立即设置结束值。使用ValueAnimator可以很好地工作。然而AnimatorSet不会打球,如果你在调用start()之前尝试结束它,它就会退出。
对此的一种解决方法是立即调用start()和end(),但它不会覆盖嵌套的AnimatorSets的情况,如下所示:
AnimatorSet mainSet = new AnimatorSet();
AnimatorSet scaleSet = new AnimatorSet();
scaleSet.playTogether(
ObjectAnimator.ofFloat(view, "scaleX", 0.5f),
ObjectAnimator.ofFloat(view, "scaleY", 0.5f));
mainSet.playSequentially(
ObjectAnimator.ofFloat(view, "alpha", 0.5f),
scaleSet);
mainSet.start();
mainSet.end();
这会导致mainSet在其所有子节点上调用end()。但是由于AnimatorSet.end()被破坏,scaleSet不会设置结束值。我试图扩展AnimatorSet类并修复它,但很快发现它标记为final。
在我的应用程序中,我主要使用动画,但有一些情况下不需要动画。有没有人知道如何实现正确的行为?
答案 0 :(得分:0)
您可以通过以下方式对所有儿童动画执行此操作:
for (Animator animation : mainSet.getChildAnimations())
{
animation.start();
animation.end();
}
答案 1 :(得分:0)
我知道这是一个老问题,但递归方法可以解决这个问题:
void endAnimationsRecursively(final Animator mainAnimator){
if (mainAnimator instanceof AnimatorSet) {
for (final Animator animator : ((AnimatorSet)
mainAnimator).getChildAnimations()) {
endAnimationsRecursively(animator);
}
mainAnimator.end();
mainAnimator.cancel();
}
}