ValueAnimator 让一个元素消失?

ValueAnimator makes one element disappear?

我正在尝试制作一个动画,其中我有 4 个以不同方式玩杂耍的圆圈。

我正在使用 ValueAnimator 来执行此操作,但是当我第二次重复 AnimatorSet 时,一个元素消失并重新出现...

这是怎么回事?有人知道吗?

代码如下:

    objAnimator = ValueAnimator.ofFloat(0, 1);
    objAnimator.setDuration(DURATION);
    objAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float value = (Float) animation.getAnimatedValue();

            elements[2].setTranslationX(lateralDistance * value);
        }
    });

    objAnimatorTwo = ValueAnimator.ofFloat(0, 1);
    objAnimatorTwo.setDuration(DURATION);
    objAnimatorTwo.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float value = (Float) animation.getAnimatedValue();

            elements[1].setTranslationX(lateralDistance * value);
        }
    });

    objAnimatorThree = ValueAnimator.ofFloat(0, 1);
    objAnimatorThree.setDuration(DURATION * 2);
    objAnimatorThree.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float value = (Float) animation.getAnimatedValue();

            elements[3].setTranslationX((-lateralDistance * 2) * value);
            elements[3].setTranslationY((float)(-100 * Math.sin(value*Math.PI)));
        }
    });

    animatorSet = new AnimatorSet();
    animatorSet.play(objAnimator).with(objAnimatorThree)
                .before(objAnimatorTwo);
    animatorSet.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {
        }
        @Override
        public void onAnimationEnd(Animator animation) {
            elements[1].layout(elements[1].getLeft() + (int) lateralDistance,
                    elements[1].getTop(),
                    elements[1].getRight() + (int) lateralDistance,
                    elements[1].getBottom());

            elements[2].layout(elements[2].getLeft() + (int) lateralDistance,
                    elements[2].getTop(),
                    elements[2].getRight() + (int) lateralDistance,
                    elements[2].getBottom());

            elements[3].layout(elements[3].getLeft() + (int)(-lateralDistance * 2),
                    elements[3].getTop(),
                    elements[3].getRight() + (int)(-lateralDistance * 2),
                    elements[3].getBottom());

            presetElementArray();
            animatorSet.start();
        }
        @Override
        public void onAnimationCancel(Animator animation) {
        }
        @Override
        public void onAnimationRepeat(Animator animation) {
        }
    });

这里是方法 presetElementArray()

private void presetElementArray() {
    IndicatorElement temp1 = elements[1];
    IndicatorElement temp2 = elements[2];
    IndicatorElement temp3 = elements[3];

    elements[1] = temp3;
    elements[2] = temp1;
    elements[3] = temp2;
}

我正在使用一个数组元素来管理圆圈,在一个循环完成后,我在 AnimatorSet 的 AnimatorListener 中设置每个元素的位置,之后我交换数组中的元素,所以它们做不同的事情第二个循环中的任何动作,我重复。

这是结果:animation slowed and colored

尝试不仅更改布局,还尝试重置元素的翻译。我是说

elements[i].setTranslationX(0) 

onAnimationEnd()

你没有要求这个,但我认为它可能会有帮助...

使您的代码更好(更小)的一些技巧:

  1. 如果您有空方法,请使用 AnimatorListenerAdapter 而不是 Animator.AnimatorListener
  2. ObjectAnimator 通常比 ValueAnimator.
  3. 编码更快

您可以在 Android API Guide 中找到更多提示。

我对你的代码做了一些重构作为例子:https://pastebin.com/Fik5F7vQ