我有一个使用Swing Timers执行2D动画的Swing程序。每按一次按钮,就会创建几个定时器来为几个不同的组件设置动画 - 其中一些是从屏幕移开而其他组件继续移动。 (我不知道提前每次点击按钮需要执行什么动画,但是在运行时区分动画的两种“类型”并不是一个问题 - 它们是从不同的方法启动的,因此很容易想象一下将它们添加到两个不同的“队列” - 一个传出项目的队列和一个传入项目的队列。完成后,我可以实现调用
的基本策略那就是说 - 所有这一切对我来说都是直觉,启发式的 - 我还没弄清楚如何在实践中实现它。那些“队列”实际上是什么,以及什么类会持有并稍后执行它们?大概是一个实现Runnable,创建第二个线程,可以执行动画,更严格地控制它们如何进行?或者事件派发线程在这里给我足够的控制:有没有办法使用SwingUtilities.invokeAndWait()
(或类似的东西)来收集要执行的所有动画,同时为某个类的那些分配优先级,或以某种方式标记?
答案 0 :(得分:5)
我建议你看看一些现有动画引擎的设计,如:
一般来说,这些引擎往往会有一个中心“时钟”,它以规则的间隔打勾。然后,他们提供回调功能,通知感兴趣的各方已发生“勾号”。
然后,他们在此概念之上提供了一系列图层,以便更容易与之交互,例如为动画提供时间范围,以百分比的形式呈现(而不是物理时间测量),这可以是用于计算变化的分数。还提供插值,允许您在整个时间周期内影响动画的速度(例如慢速,快速输出效果)。
这种方法减少了必须运行多个Timer
的开销,这可能会降低性能,同时提供分离模型,因此每个“动画”都是它自己的实体。
就个人而言,我会对每一个进行评估,看看哪个最适合您的需求并与之共存,但如果您真的想亲自去做,它们为想法和设计提供了良好的起点