我已经实现了一个自定义视图,这基本上是一个飞轮。你可以用你的手指转动它。它工作得很好,直到我试图在飞轮上实现某种惯性,当触摸被释放时。问题是,不像有人在滚动车轮,惯性动画是滞后和不稳定的。
我发现onFling方法非常有用,但是当我在onScroll方法中计算车轮的角速度时,我没有发现需要重写onFling。我还找到了滚动API,它提供了在使用惯性将其播放到动画类时所需的位置。
由于我希望我的应用程序用于API 11以下的用户,我不能使用动画类。因此,我提出了使用可运行的解决方案,它根据当前的角速度移动我的滑块(飞轮),降低这个速度并重新运行,直到速度低于某个值。当有onUp事件时启动Runnable,在触发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);
}
}
};据我所知,问题在于调用了moveSlider()内部的失效()方法,该方法被多次调用。或者,进程应该等待失效结束,然后才能收回它。在这里,运行程序每20毫秒调用一次。我试图改变这一价值,但没有取得任何成功。
是否有一种使用处理程序正确实现动画的方法,或者是否应该更改为类似于ASyncTask的其他内容?
发布于 2015-07-29 08:27:00
用你的方式,我觉得很难说-你是对的,还是不对。
惯量动画在android中通过使用插值来实现。
Android中的处理程序是一个处理UI消息的工具。但是,对于它的工作速度没有任何辩解。也许你会有30个FPS,也许你会有100个FPS或10个用于糟糕的表现。
因此,我强烈建议您不要在自己的动画中使用Handler .。
Android必须要有漂亮而简单的框架才能做到这一点。
对于惯性(在我过去的工作中,我做同样的事情),您可以使用ObjectAnimator或\和ValueAnimator。
您可以在这指南中找到更多信息。
https://stackoverflow.com/questions/31694913
复制相似问题