使用AnimatorSet设置没有动画的结束值

时间:2014-08-18 19:06:03

标签: android animation

根据文档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。

在我的应用程序中,我主要使用动画,但有一些情况下不需要动画。有没有人知道如何实现正确的行为?

2 个答案:

答案 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();
        }
    }