Android自定义补间 - 计时器与ScheduledThreadPoolExecutor,或替代

时间:2012-02-10 21:02:01

标签: android

我正在开发针对Android 2.2的自定义补间效果。这不是一个直观的视图动画(许多事情都是基于补间的进展而发生的),因此2.2中提供的动画类是不够的(显然Animator会这样做但不可用)。

我已经实现了基本逻辑(移植我之前编写的JS和AS补间引擎),它似乎工作正常,但有点慢。例如,在JS或AS中运行25ms的间隔会产生平滑的视觉效果,但在Android实现中似乎“矮胖” - 将间隔缩短到10ms似乎对某些人有所帮助,但它肯定不如内置的那么顺畅动画。

我正在使用Timer和Timer任务 - 我已经读过ScheduledThreadPoolExecutor是“首选”但是从我所看到的优势似乎更多地与异常处理和多个任务有关(我只会有一个补间跑步。)

定时器特别慢吗?如果ScheduledThreadPoolExecutor更有效率?还有其他更好的替代方案,我不知道吗?

TYIA

3 个答案:

答案 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) {
            }
        }               
    }
};

其中originalValuedestinationValuesetValue只是处理补间增量的任意成员。 timeKeeper是一个非常简单的类,它只测量经过的时间,并返回delta(经过时间/持续时间)。 getEasedProgress只是对该delta应用了一些基本的缓动插值。

感谢谷歌Android开发者邮件列表中的pskink,指出我的方向正确。

答案 1 :(得分:2)

我在ScheduledThreadPoolExecutor中看到的主要优点是可以池化线程数,如果一个线程以某种方式挂起,则可以从定义的池中使用其他线程。这是有趣的SO discussion on this topic.

答案 2 :(得分:2)

您不需要ScheduledThreadPoolExecutor,因为您不需要ThreadPool,您只需要一个线程来管理您的动画。减速可能是在动画引擎的实现中。我不确定Timer的效果如何。