ObjectAnimator多次点击停止/取消/重启动画

时间:2017-12-31 16:14:45

标签: android animation android-animation

我已经分配了onClick方法,它启动了多个动画w / follow结构

private static void aniChain (params)
    final ObjectAnimator step1 = RotateObj(params);

    final ObjectAnimator step2 = AlphaObj(params);
    final ObjectAnimator step3 = ScaleXObj(params);
    final ObjectAnimator step4 = ScaleYObj(params);

    final ObjectAnimator step5 = ScaleXObj(params);
    final ObjectAnimator step6 = ScaleYObj(params);

    final ObjectAnimator step7 = AlphaObj(params);

   step1.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationStart(Animator animation) {
            super.onAnimationStart(animation);
            isAnimate = true;  //another control option
            step2.start();
            step3.start();
            step4.start();
        }
    });

    step2.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            step5.start();
            step6.start();
        }
    });

    step6.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            step7.start();
        }
    });

    step7.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            v.setImageDrawable(null);
            isAnimate = false; // another control option
        }
    });

    if (!step1.isStarted()) {
        step1.start();
    }

基本上,链条在第一次点击时工作正常,但在第二次或更多时点击它会发出错误。问题是如何制止它们?

我已经尝试了第二次点击的另一个条件

    if (!step1.isStarted()) {  //if opener is not started then start it
        step1.start();
    }
    if (step1.isStarted()) {   //and if it was started then cancel every 
        step1-7.cancel();      //animation as they are and proceed to end of last animation
        step7.end();
    }

然而它仍然是错误的。取消冻结动画在这里类似于暂停,但没有恢复的选项。它永远不会将状态更改为初始状态或任何其他状态,因此我几乎不理解cancel()的要点。无论如何根据我的逻辑在第二个条件检查我冻结所有动画,无论他们的状态如何,并继续到最后一个动画结束删除图像。

多次点击后,不知怎的多个这些动画往往相互回应,好像它们在方法调用中彼此分开。

也试过

   if (!isAnimate) {
        step1.start();
    } else if (isAnimate) {
        step1-7.cancel();
        step7.end();
    }

不起作用。

还有其他方法可以检查isRunning()并停止这些动画吗?

UPD

添加了这个

    if (!isAnimate) {
        step1.start();
        Log.i("boolean","sun "+ isAnimate);
    } else {
        isAnimate = false;
        Log.i("boolean","sun "+ isAnimate);
    }

    while (step1.isStarted() && isAnimate) {
        step1-2.cancel();
        step7.end();
    }

但在那种情况下,动画永远不会开始。添加到if s会使其在布尔值更改为true时跳到最后一步,但在第二次单击时不会跳到最后一步。我猜我需要某种倾听者而不是循环。

2 个答案:

答案 0 :(得分:0)

每当您调用aniChain()来启动动画时,动画的每个对象(即步骤1,步骤2 ....)都会一次又一次地创建。尝试将它们设为全局或至少应该实例化一次,这样您就可以处理相同的动画对象。对于结束动画,step1.end是停止指定对象动画的正确方法。

答案 1 :(得分:0)

解决方案

添加"假" obj animator,总持续时间为0开始随机道具的停止。其他动画师的步骤会覆盖那个道具,而假的一个计时器会一直持续到最后。

    stepFake.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            if (!isAnimate) {
                step7.end();
            }
        }
    });