2015-02-07 98 views
4

我有下面的代码(在斯卡拉Android项目):我可以重复使用ValueAnimator吗?

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

你就是不行。我刚刚检查过它。我也想在应用程序中重用它。所以使用clone来获得一个新的实例,然后为每个实例设置目标视图。 – Napolean 2015-06-18 08:03:56

回答

0

您无法重复使用动画。

你需要复位(),并通过调用再次使用同一个对象之前,初始化()方法重新初始化动画对象。这与实例化新的动画对象相似。

+0

ValueAnimator是动画师,而不是动画。 – 2017-02-06 14:08:22

2

您可以通过以下方式重复使用动画:

... 
animator.end(); 
animator.setFloatValues(...); 
animator.start(); 
... 

您还可以使用animator.cancel()代替animator.end()并通过最后一个值从去年的动画新动画作为起始浮动。例如,如果上一个动画值为50,则可以拨打animator.setFloatValues(50, 0f),以便您的动画看起来连接起来。

考虑到接受的答案表明这是不可能的,我想提到的是,当用户用两个手指点击时,所描述的方法在Touch Circle应用中使用。顺便说一句,这是一个非常不错的效果,当物体颤抖一点点 - 用它如你所愿,代码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(); 
} 
相关问题