我正在开发针对Android 2.2的自定义补间效果。这不是一个直观的视图动画(许多事情都是基于补间的进展而发生的),因此2.2中提供的动画类是不够的(显然Animator会这样做但不可用)。
我已经实现了基本逻辑(移植我之前编写的JS和AS补间引擎),它似乎工作正常,但有点慢。例如,在JS或AS中运行25ms的间隔会产生平滑的视觉效果,但在Android实现中似乎“矮胖” - 将间隔缩短到10ms似乎对某些人有所帮助,但它肯定不如内置的那么顺畅动画。
我正在使用Timer和Timer任务 - 我已经读过ScheduledThreadPoolExecutor是“首选”但是从我所看到的优势似乎更多地与异常处理和多个任务有关(我只会有一个补间跑步。)
定时器特别慢吗?如果ScheduledThreadPoolExecutor更有效率?还有其他更好的替代方案,我不知道吗?
TYIA
答案 0 :(得分:4)
对于未来的搜索者,答案是只使用直接的Handler和sendMessage(没有延迟)。
经过大量实验,包括线程,计时器,执行器等,最佳性能,最可预测的结果和最简单的代码基本上只是:private Handler handler = new Handler() {
@Override
public void handleMessage(final Message message) {
switch (message.what) {
case TWEEN:
try {
double progress = timeKeeper.getEasedProgress(5);
float position = (float) originalValue + ((destinationValue - originalValue) * progress));
setValue(position);
if(!timeKeeper.atEnd()){
sendEmptyMessage(TWEEN);
}
} catch (Exception e) {
}
}
}
};
其中originalValue
,destinationValue
和setValue
只是处理补间增量的任意成员。 timeKeeper
是一个非常简单的类,它只测量经过的时间,并返回delta(经过时间/持续时间)。 getEasedProgress
只是对该delta应用了一些基本的缓动插值。
感谢谷歌Android开发者邮件列表中的pskink,指出我的方向正确。
答案 1 :(得分:2)
我在ScheduledThreadPoolExecutor中看到的主要优点是可以池化线程数,如果一个线程以某种方式挂起,则可以从定义的池中使用其他线程。这是有趣的SO discussion on this topic.
答案 2 :(得分:2)
您不需要ScheduledThreadPoolExecutor,因为您不需要ThreadPool,您只需要一个线程来管理您的动画。减速可能是在动画引擎的实现中。我不确定Timer的效果如何。