使用handler和runnable实现平滑动画

时间:2015-07-29 08:16:04

标签: java android animation

我已经实现了一个基本上是飞轮的自定义视图。您可以用手指将其滚动。它工作正常,直到我试图在触摸释放时在飞轮上实现某种惯性。问题在于,与某人滚动滚轮时不同,惯性动画是滞后和生涩的。

我发现onFling方法非常有用,但是当我在onScroll方法中计算方向盘的角速度时,我没有发现需要覆盖onFling。我还发现了Scroller API,它为您提供了使用惯性将其用于Animation类时所需的位置。

由于我希望我的应用程序可用于API 11以下的用户,因此我无法使用Animation类。所以我提出了使用Runnable的解决方案,根据当前的角速度移动我的滑块(飞轮),降低此速度并重新运行直到速度低于某个值。 Runnable在发生onUp事件时启动,在触发onDown事件时停止。

public static final double REFRESH_RATE = 20.;
public static final double MIN_SPEED = 0.005;
private static final Handler mInertiaHandler = new Handler();
private final Runnable mInertiaRunnable = new Runnable() {
   public void run() {
      if(Math.abs(mAngularSpeed) > MIN_SPEED) {
         mAngleIter = mAngularSpeed *= 0.95;
         moveSlider();
         mInertiaHandler.postDelayed(this, (long) REFRESH_RATE);
      }
   }
};

据我所知,问题在于invalidate()方法,在moveSlider()内部调用,被调用太多次。或者,在调用之前,进程应该等待invalidate结束。这里runnable每20毫秒调用一次。我试图改变这个值,但没有取得任何成功。

有没有办法用处理程序正确实现动画,还是应该更改为ASyncTask等其他东西?

1 个答案:

答案 0 :(得分:0)

用你的方式,我觉得很难说 - 你是对的,不是。

通过使用插值实现android中的惯性动画。

Android中的Handler是一个处理UI消息的工具。但是,没有任何关于它将如何快速工作的辩护。可能你会有30 FPS,也许你会有100 FPS或10可怕的表现。

所以我强烈建议您不要使用处理程序来制作自己的动画。

Android API必须为您提供美观且简单的框架。

对于惯性(我过去的工作,我做同样的事情)你可以使用ObjectAnimator或\和ValueAnimator

您可以在this指南中找到更多信息。