我试图制作一个动画,其中有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中设置每个元素的位置,之后我交换了数组中的元素,所以,它们做的不同第二个循环中的任何形式,我再说一遍。
答案 0 :(得分:0)
不仅要尝试更改布局,还要重置元素的翻译。我的意思是
elements[i].setTranslationX(0)
in
onAnimationEnd()
你没有要求这个,但我认为这可能会有所帮助......
使您的代码更好(更小)的一些提示:
AnimatorListenerAdapter
代替Animator.AnimatorListener
。ObjectAnimator
更快ValueAnimator
。您可以在Android API Guide找到更多提示。
我对您的代码进行了一些重构,例如:https://pastebin.com/Fik5F7vQ