Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android自定义tween-计时器vs ScheduledThreadPoolExecutor,或其他_Android - Fatal编程技术网

Android自定义tween-计时器vs ScheduledThreadPoolExecutor,或其他

Android自定义tween-计时器vs ScheduledThreadPoolExecutor,或其他,android,Android,我正在开发一个针对安卓2.2的定制tween效果。这不是一个直视图动画(很多事情都是基于tween的进度发生的),因此2.2中可用的动画类是不够的(显然Animator会这样做,但不可用) 我已经实现了基本逻辑(移植了JS和我之前编写的tweening引擎),它似乎工作正常,但有点慢。例如,在JS或AS中运行25毫秒的间隔可以产生平滑的视觉效果,但在Android实现中似乎“笨重”——将间隔缩短到10毫秒似乎有帮助,但肯定不如内置动画平滑 我使用的是计时器和计时器任务——我已经读到Schedul

我正在开发一个针对安卓2.2的定制tween效果。这不是一个直视图动画(很多事情都是基于tween的进度发生的),因此2.2中可用的动画类是不够的(显然Animator会这样做,但不可用)

我已经实现了基本逻辑(移植了JS和我之前编写的tweening引擎),它似乎工作正常,但有点慢。例如,在JS或AS中运行25毫秒的间隔可以产生平滑的视觉效果,但在Android实现中似乎“笨重”——将间隔缩短到10毫秒似乎有帮助,但肯定不如内置动画平滑

我使用的是计时器和计时器任务——我已经读到ScheduledThreadPoolExecutor是“首选”的,但从我读到的内容来看,它的优势似乎更多地体现在异常处理和多个任务上(我将只运行两个任务中的一个)

定时器特别慢吗?如果ScheduledThreadPoolExecutor更高效?有没有其他更好的选择,我不知道


TYIA

我看到的ScheduledThreadPoolExecutor的主要优点是,如果一个线程以某种方式处于饥饿状态,则可以从定义的池中使用另一个线程,则可以将多个线程汇集在一起。有趣的是,您不需要ScheduledThreadPoolExecutor,因为您不需要ThreadPool,您只需要一个线程来管理动画。减速可能是在动画引擎的实现中。我不确定计时器的效果如何。

对于未来的搜索者,答案是只使用一个直接的处理程序和发送消息(没有延迟)

经过大量实验,包括线程、计时器、执行器等,最佳性能、最可预测的结果和最简单的代码基本上就是:

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
是一个非常简单的类,它只测量ellapsed时间,并返回增量(ellapsed/duration)
getEasedProgress
只对该增量应用一些基本的缓和插值


感谢谷歌android开发者邮件列表中的pskink为我指明了正确的方向。

谢谢你的评论。动画引擎是纯数学的,它本身应该非常快(对该数学作出反应的代码——不是引擎本身的一部分,而是侦听器的一部分——可能不是)。对于这样一个持续时间短、间隔时间长的操作,您有什么建议?@BigMoMo我还没有实现动画引擎,但为什么不实现一个每25毫秒休眠一次的线程,然后绘制动画呢?我假设你的AS和JS动画在电脑上运行顺畅,这可能比你的android手机处理能力强得多。谢谢你的评论。您包含的链接是指向此页面的链接,顺便说一句。对于这样的短时间、高间隔定时操作,您有什么建议?该链接中的信息很好-我没有使用守护进程,现在将尝试使用它+1.