知道GIF何时完成播放

时间:2017-02-06 21:30:06

标签: java animation gif

我试图向JLabel显示GIF文件。没问题我加载GIF并将其设置为标签的图标。但现在我真的需要知道什么时候结束,因为它必须作为一个过场动画。我已经尝试过这个(GameScene是一个自定义对象,但我知道setIcon有效,相信我):

private GameScene scene;
private ImageIcon _temp;
private ImageIcon toplay;
private Thread anim;

public Cutscene(ImageIcon gif, GameScene scene, int length){
    this._temp = scene.getIcon();
    this.toplay = gif;
    this.scene = scene;
    anim = new Thread(){
        @Override
        public void run(){
            scene.setIcon(gif);
            scene.repaint();
            try {
                Thread.sleep(length);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
}

private void _s(){
    scene.setSolidColor(false);
    scene.setIcon(toplay);
    scene.repaint();
}

public void play(){
    _s();
    anim.start();
}

public void await(){
    try {
        anim.join();
        scene.setIcon(_temp);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

现在,无论如何我可以实现这一目标,只需让整个程序在给定的时间内休眠,然后继续使用其余的代码并完全不绘制GIF文件?

2 个答案:

答案 0 :(得分:2)

这是一个非常简单的例子,它只适用于非循环的GIF,如果你的gif重复,你必须测试FRAMEBITS的请求之间的时间,并尝试确定你是否能够检测到循环的点。

public class MonitoringLabel extends JLabel {

    public MonitoringLabel(Icon image) {
        super(image);
    }

    public void addActionListener(ActionListener listener) {
        listenerList.add(ActionListener.class, listener);
    }

    public void removeActionListener(ActionListener listener) {
        listenerList.remove(ActionListener.class, listener);
    }

    protected void fireActionPerformed() {
        ActionListener[] listeners = listenerList.getListeners(ActionListener.class);
        if (listeners.length > 0) {
            ActionEvent evt = new ActionEvent(this, 0, "stopped");
            for (ActionListener listener : listeners) {
                listener.actionPerformed(evt);
            }
        }
    }

    @Override
    public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) {
        boolean finished = super.imageUpdate(img, infoflags, x, y, w, h);
        if (!finished) {
            fireActionPerformed();
        }
        return finished;
    }

}

上面的类提供了一个ActionListener,当图像"完成"加载(当它们在要播放的动画中没有新帧时触发 - 重复的GIF永远不会返回false

如果需要,您可以使用不同的侦听器界面,我只是将它作为示例放在一起。

我选择覆盖imageUpdate的原因是因为JLabel在绘制图片时已经充当图片的ImageObserver,这样我们就可以使用JLabel的强大功能{1}}无需手动绘制一个gif的烦恼...是的我已经完成了它,它的痛苦

答案 1 :(得分:0)

是否有可能使GIF不重复用于制作它的程序?大多数制作GIF图像的照片编辑器都可以让您重复或不重复。

如果我理解你的问题,你似乎只想让gif玩一次?

如果是剪辑场景,为什么不让节目在那段时间内睡觉?