ValueAnimator让一个元素消失了吗?

时间:2017-05-07 12:37:22

标签: java android animation android-animation

我试图制作一个动画,其中有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

1 个答案:

答案 0 :(得分:0)

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

elements[i].setTranslationX(0) 

in

onAnimationEnd()

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

使您的代码更好(更小)的一些提示:

  1. 如果您有空方法,请使用AnimatorListenerAdapter代替Animator.AnimatorListener
  2. 代码通常比ObjectAnimator更快
  3. ValueAnimator
  4. 您可以在Android API Guide找到更多提示。

    我对您的代码进行了一些重构,例如:https://pastebin.com/Fik5F7vQ