目前在我的代码中我有一个像:
这样的BufferedImageGraphics2D g2d = (Graphics2D) g;
g2d.transform(at); //at is an AffineTransform that just rotates the .gif
g2d.drawImage(sharkie, xCenter-5*radius, yCenter-3*radius, 10*radius, 6*radius, null);
我已经将它完全用作BufferedImage,但正如预期的那样它只显示第一帧。我想知道是否有人知道一种类似于BufferedImage的方式,它适用于GIF动画。我似乎无法使用将其添加到JButton的技术。我也无法弄清楚是否有一个可行的ImageObserver可以在drawImage()调用中为.gif设置动画。
我愿意尝试任何事情,但我最感兴趣的是可以使用ImageObserver进行绘制调用,因为这只会是一个很小的变化。
谢谢大家!
答案 0 :(得分:0)
“我已经将它完全用作BufferedImage,但正如预期的那样只显示第一帧”
尝试使用ImageIO.read(...)
读取图像时会发生这种情况。如果你用new ImageIcon(...).getImage()
阅读它,你将获得gif动画。请参阅here。
“我也无法弄清楚是否有一个可行的ImageObserver会在drawImage()调用中为.gif设置动画。”
ImageObserver
是您正在绘制的组件。因此,您应该使用drawImage(..., null)
drawImage(..., this)
“我愿意尝试任何事情,但我最感兴趣的是可以使用ImageObserver进行绘制调用,因为这只会是一个很小的改变。”
结合上面两点,你得到了答案。
将此代码作为测试运行。从this answer
获取的gif图像import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestGif {
public TestGif() {
JFrame frame = new JFrame();
frame.add(new GifPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public class GifPanel extends JPanel {
Image image;
{
try {
image = new ImageIcon(new URL("http://i.stack.imgur.com/lKfdp.gif")).getImage();
} catch (MalformedURLException ex) {
Logger.getLogger(TestGif.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
@Override
public Dimension getPreferredSize() {
return image == null ? new Dimension(200, 200)
: new Dimension(image.getWidth(this), image.getHeight(this));
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TestGif();
}
});
}
}