我可以重用ValueAnimator吗?

时间:2015-02-07 21:03:29

标签: android animation reusability

我有以下代码(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运行时触摸屏幕,则它会正确开始向后工作(因为我已交换了值)。但如果我在完成后触摸屏幕,那么没有任何反应,它不会重新开始。

问题是,我可以以某种方式重复使用这个动画师,并在它停止后再次使用它吗?

2 个答案:

答案 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()方法重新初始化动画对象。这类似于实例化一个新的动画对象。