我可以重用 ValueAnimator 吗?
Can I reuse ValueAnimator?
我有以下代码(Android Scala 项目):
val animator = new ValueAnimator
animator.setFloatValues(0f, 100f)
animator.setDuration(20000L)
animator.addUpdateListener(this) // prints current value to console
animator.start
override def onTouch(v: View, event: MotionEvent) = {
animator.setFloatValues(100f, 0f)
animator.setCurrentPlayTime(0)
if (!animator.isRunning) animator.start
true
}
如果我在 animator
为 运行 时触摸屏幕,那么它会正确地开始向后工作(因为我已经交换了值)。但是,如果我在完成后触摸屏幕,那么什么也不会发生,它不会重新开始。
问题是我能否以某种方式重用此动画制作器并使其在停止后针对给定值再次工作?
您不能重复使用动画。
您需要 reset() 并在再次使用同一对象之前通过调用 initialize() 方法重新初始化动画对象。这类似于实例化一个新的动画对象。
您可以通过以下方式重复使用 animator:
...
animator.end();
animator.setFloatValues(...);
animator.start();
...
您也可以使用 animator.cancel()
而不是 animator.end()
并将上一个动画的最后一个值作为起始浮动传递给新动画。例如,如果最后一个动画值是 50,您可以调用 animator.setFloatValues(50, 0f)
这样您的动画看起来是连贯的。
考虑到接受的答案表明这是不可能的,我想提一下,当用户用两根手指点击时,Touch Circle 应用程序中使用了所描述的方法。顺便说一句,当物体稍微颤抖时,这是一个非常好的效果 - 随意使用它,代码摘录如下:
void shapeTremble(long delay) {
if (null == animatorTremble) {
ValueAnimator animator = new ValueAnimator();
animator.setDuration(850).setInterpolator(new AccelerateDecelerateInterpolator());
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
setCircleScale((Float) valueAnimator.getAnimatedValue(), true);
}
});
animatorTremble = animator;
} else {
animatorTremble.cancel();
}
animatorTremble.setFloatValues(circleScale, 0.85f, 1.05f, 0.95f, 1.025f, 1.0f);
animatorTremble.setStartDelay(delay);
animatorTremble.start();
}
我有以下代码(Android Scala 项目):
val animator = new ValueAnimator
animator.setFloatValues(0f, 100f)
animator.setDuration(20000L)
animator.addUpdateListener(this) // prints current value to console
animator.start
override def onTouch(v: View, event: MotionEvent) = {
animator.setFloatValues(100f, 0f)
animator.setCurrentPlayTime(0)
if (!animator.isRunning) animator.start
true
}
如果我在 animator
为 运行 时触摸屏幕,那么它会正确地开始向后工作(因为我已经交换了值)。但是,如果我在完成后触摸屏幕,那么什么也不会发生,它不会重新开始。
问题是我能否以某种方式重用此动画制作器并使其在停止后针对给定值再次工作?
您不能重复使用动画。
您需要 reset() 并在再次使用同一对象之前通过调用 initialize() 方法重新初始化动画对象。这类似于实例化一个新的动画对象。
您可以通过以下方式重复使用 animator:
...
animator.end();
animator.setFloatValues(...);
animator.start();
...
您也可以使用 animator.cancel()
而不是 animator.end()
并将上一个动画的最后一个值作为起始浮动传递给新动画。例如,如果最后一个动画值是 50,您可以调用 animator.setFloatValues(50, 0f)
这样您的动画看起来是连贯的。
考虑到接受的答案表明这是不可能的,我想提一下,当用户用两根手指点击时,Touch Circle 应用程序中使用了所描述的方法。顺便说一句,当物体稍微颤抖时,这是一个非常好的效果 - 随意使用它,代码摘录如下:
void shapeTremble(long delay) {
if (null == animatorTremble) {
ValueAnimator animator = new ValueAnimator();
animator.setDuration(850).setInterpolator(new AccelerateDecelerateInterpolator());
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
setCircleScale((Float) valueAnimator.getAnimatedValue(), true);
}
});
animatorTremble = animator;
} else {
animatorTremble.cancel();
}
animatorTremble.setFloatValues(circleScale, 0.85f, 1.05f, 0.95f, 1.025f, 1.0f);
animatorTremble.setStartDelay(delay);
animatorTremble.start();
}