本帖最后由 v5_6000 于 2011-03-16 00:21:21 编辑

解决方案 »

  1.   

    双缓冲如楼上所说。 
    关于 ImageObserver 常数,在 API 中已经有说明了:
      ABORT      图像加载被中断
      ALLBITS      所有的位都已经加载给图像
      ERROR      在加载过程中发生错误
      FRAMEBITS    多帧图像的一个帧被传送,一般用于动画GIF
      HEIGHT      图像的高度已经可用
      PROPERTIES    图像的属性已经可用
      SOMEBITS    图像的缩放变体的多个位已可用
      WIDTH      图像的宽度已经可用另外,在 Swing 组件中,默认已经使用双缓冲了。 只要在 paint(), paintXXX() 方法中绘制图像,默认就是爽缓冲的。 
    例如:import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.io.IOException;import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;public class GifPanel extends JPanel { /**
     * 
     */
    private static final long serialVersionUID = 5591574532236923320L;

    private Image gif;

    public GifPanel(Image gif) {
    this.gif = gif;

    waitForImage(this, gif);
    }

    public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(gif, 0, 0, this);
    }

    /**
     * 控制动画播放速度
     */
    public boolean imageUpdate(Image image, int flags, int x, int y, int w, int h) {
    if((flags & FRAMEBITS) != 0) {
    try {
    //每帧停顿时间
    Thread.sleep(20);
    } catch(Exception e) {
    e.printStackTrace();
    }
    repaint();
    }
    return true;
    }

    /**
     * 等待图像加载完成,
     */
    private void waitForImage(Component component,Image image) {
    MediaTracker tracker = new MediaTracker(component);
    try{
    tracker.addImage(image,0);
    tracker.waitForID(0);
    } catch(InterruptedException e){
    e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);

    frame.setSize(300, 500);

    Image gif = null;
    try {
    gif = ImageIO.read(GifPanel.class.getResourceAsStream("1.gif"));
    } catch (IOException e) {
    e.printStackTrace();
    }

    frame.getContentPane().add(new GifPanel(gif));
    frame.setVisible(true);
    }
    });
    }
    }
      

  2.   

    pengranxiang: JPanel 这个代码我尝试了。只显示动画的第一帧,图片不会动了。java2000_net:双缓冲区在实现的时候是paint方法里面的drawImage传入的是背景的offScreenImage还是在offScreenGC中输出过的图片呢?我看网上有输出在缓冲区里面drawImage过的图片的。有输出offScreenGC的。还有输出Image对象的。使用double-buffer输出静态图(jpg png)和输出动画图(gif)的代码有差别么?
    大家能帮忙给一个能播放动画的代码么?
      

  3.   

    发现有的动画图是正常的,有的动画图播放的非常快。
    是GIF还有很多的格式么?
    我看都是GIF89的格式啊。