我有以下代码(Scala中的Android项目):
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
运行时触摸屏幕,则它会正确开始向后工作(因为我已交换了值)。但如果我在完成后触摸屏幕,那么没有任何反应,它不会重新开始。
问题是,我可以以某种方式重复使用这个动画师,并在它停止后再次使用它吗?
答案 0 :(得分:3)
您可以通过以下方式重复使用动画师:
...
animator.end();
animator.setFloatValues(...);
animator.start();
...
您还可以使用animator.cancel()
代替animator.end()
,并将上一个动画中的最后一个值作为起始浮点数传递给新动画。例如,如果上一个动画值为50,则可以调用animator.setFloatValues(50, 0f)
,以便您的动画看起来已连接。
考虑到已接受的答案表明它是不可能的,我想提一下,当用户用两根手指敲击时,Touch Circle app中使用了所描述的方法。顺便说一句,当对象颤抖一点时它是一个非常好的效果 - 按照你的意愿使用它,代码exerpt如下:
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();
}
答案 1 :(得分:1)
您无法重复使用动画。
您需要重置()并在再次使用同一对象之前调用 initialize()方法重新初始化动画对象。这类似于实例化一个新的动画对象。