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()
你没有要求这个,但我认为它可能会有帮助...
使您的代码更好(更小)的一些技巧:
- 如果您有空方法,请使用
AnimatorListenerAdapter
而不是 Animator.AnimatorListener
。
ObjectAnimator
通常比 ValueAnimator
. 编码更快
您可以在 Android API Guide 中找到更多提示。
我对你的代码做了一些重构作为例子:https://pastebin.com/Fik5F7vQ
我正在尝试制作一个动画,其中我有 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()
你没有要求这个,但我认为它可能会有帮助...
使您的代码更好(更小)的一些技巧:
- 如果您有空方法,请使用
AnimatorListenerAdapter
而不是Animator.AnimatorListener
。 ObjectAnimator
通常比ValueAnimator
. 编码更快
您可以在 Android API Guide 中找到更多提示。
我对你的代码做了一些重构作为例子:https://pastebin.com/Fik5F7vQ