如何让 gif 在 Java 中运行一次并停止?

Posted

技术标签:

【中文标题】如何让 gif 在 Java 中运行一次并停止?【英文标题】:How to make a gif run once and stop in Java? 【发布时间】:2013-01-13 14:13:38 【问题描述】:

基本上我有一个游戏,我想在玩家(或敌人)死亡时播放爆炸 gif,但我希望 gif 只播放一次。 我已经在一个类中设置了所有内容,并且我有一个 ArrayList 可以在需要时添加爆炸,并且我目前已将其设置为在达到 gif 的持续时间后将其删除(使用 System.currentTimeMillis()) .唯一的问题是它不准确,有时 gif 会提前停止并消失,有时它会翻转,这两种情况都会导致下一个从另一个停止的地方开始。 是否有某种方法、类、某种监听器或任何我可以用来告诉我的 gif 在哪个帧上,或者它循环了多少次的东西?我的代码可以完成剩下的工作,我只需要在我的 if 语句中添加比这更好的东西:

g2D.drawImage(explosion, x - 150, y - 150, null);
    if(System.currentTimeMillis() - startingTime > 520)
        System.out.println(System.currentTimeMillis());//for testing accuracy
        Game.explosions.remove(this);
        explosion = null;
    

【问题讨论】:

我想如果您评论System.out.println 行,您可能会有更好的时间度量。 【参考方案1】:

通常的解决方案是不使用 gif :)

大多数游戏会单独存储 gif 的每个“帧”,并按顺序显示它们,而不是试图让 gif 渲染工作。

System.currentTimeMillis() 并不是非常准确,而且在调用绘图函数之间可能会在后台发生大量事情(所有这些都会影响帧速率),所以我建议一般不要依赖它。

【讨论】:

嗯,我确实考虑过这样做。我担心这是一种令人讨厌的方法,但是嘿,它会起作用的。我只是想确保在我不知道的地方不只有“getCurrentFrame()”方法。是的,当我测试它时,currentTimeMillis 方法像晚了 19 毫秒一样删除了它。这非常明显。 其实有:ImageReader.read(int)会读取动画GIF的单帧。但将每一帧保存为单独的文件可能更容易。

以上是关于如何让 gif 在 Java 中运行一次并停止?的主要内容,如果未能解决你的问题,请参考以下文章

text 一次玩3次并停止,手动+自动

启动Java应用程序一次并休眠还是重复启动和杀死更好?

停止循环的 GIF 图标

如何在无限循环中每 3 分钟回显一次?

Android如何停止线程的方式

如何在反应原生 IOS 中运行一次 GIF?