多次单击时ObjectAnimator停止/取消/重新启动动画

问题描述 投票:2回答:2

我已经分配了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();
    }

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

android animation android-animation
2个回答
0
投票

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


0
投票

Solution

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

    stepFake.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            if (!isAnimate) {
                step7.end();
            }
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.