Can I reuse ValueAnimator?

6
我有以下代码(Scala中的Android项目):

我有以下代码(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运行时触摸屏幕,则会正确地开始向后运行(因为我已经交换了值)。但是,如果在动画完成后触摸屏幕,则不会发生任何事情,它不会重新启动。

问题是,在停止后是否可以以某种方式重用此动画器,并在给定值之后再次正常工作?


1
不可以。我刚刚检查了一下。我也想在我的应用程序中重用它。因此,请使用克隆来获取一个新实例,然后为每个目标视图设置它们。 - Napolean
2个回答

4
您可以按以下方式重复使用动画师:
...
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();
}

1

您不能重复使用一个动画。

在再次使用同一对象之前,您需要通过调用 initialize() 方法来 reset() 并重新初始化动画对象。这类似于实例化一个新的动画对象。


ValueAnimator是动画器(Animator),而不是动画(Animation)。 - Hippo Seven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接