javaGUI学习11:AWT-加载和显示图像2

1、动画GIF

AWT中支持动画GIF。

getImage("globe.gif")

控制动画人速率: 要想控制动画的速率,要手动设置。在ImageObserver常量中,FRAMEBITS就是用来设置多帧图像中的下一帧图像出现时机。为了手动控制动画图像,要覆盖imageUpdate()。

public voolean imageUpdate(Image image, int flags, int x, int y, int w, int h){
	if(flags & FRAMEBITS != 0) {
        Thread.currentThread().sleep(500);//关闭当前线程500ms,不管下一帧什么时候出现
        repaint();
    }
   return true;
}
2、AWT构件作为图像观察者

当AWT构件作为图像观察者时,则java.awt.Component.imageUpdate()被图像的图像生产者调用——当然,这一方法在子类中同样没有覆盖。AWT 不提供构件覆盖 imageUpdate ()。

Component.imageUpdate():

public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h){
    int rate = -1;
    
    if((flags & (FRAMEBITS|ALLIBITS)) != 0){
        RATE = 0;
    }else if((flags & SOMEBITS) != 0){
        if(islnc) {
        	try {
                rate = incRate;
                if(rate < 0) 
                    rate = 0;
            }catch (Exception e) {
            	rate = 100;
            }
        }
    }
    if(rate >= 0){
    	repaint(rate,0,0,width,height);
    }
    return (flags & (ALLBITS | ABORT)) == 0;
}
  • 如果参数flags的位设置和常量FRAMEBTS或ALLBITS一致的话,则重画的速率被设置为0,同时repaint () 的一个重载方案被调用。在图像重画之前速率设置最大时间(单位为ms)。所以,如果所有的图像位被加载或者在多帧图像中的下一帧已可用的话,则构件将会被立即重绘制。
  • 如果一部分位被加载,则决定一个重画速率,并且构件在指定的时间内重绘制;只要变量isInc的值是true,这表明图像将会被递增画出。
  • 如果图像的位没有被完全加载,而且图像的加载过程没有被中断,则Component . imageUpdate ()的返回值是true。从前面的学习中,我们知道返回值true表明图像有更多的更新要求,意味着图像生产者将继续调用imageUpdate ()。相反地,如果返回的值是false的话,则表明图像没有新的更新要求。如果图像是一个多帧图,其返回值一般都是true,其结果是引起多帧图的继续变化。
  • 在Component类中,保持两个变量,即布尔变量isInc和整型变量incRate。布尔变量isInc的值依赖于系统属性 awt.image . incrementalDraw的值。如果这个系统属性值是false,则在图像完全加载之前,不执行图像的重画指令。反之,只要有更多的图像位被加载,图像就会被重画。整型变量incRate可能被设置为系统属性 awt. image . redrawrate 的值,如果该系统属性没有被设置的话,其缺省值为100ms 。
  • 在AWT构件中,使用系统属性控制图像重画,在AWT构件中,有下面的两个系统属性影响图像的重画特征:
    • awt.image.incrementalDraw
    • awt.image.redrawrate
    • 如果awt.image.incrementalDraw的值是false,则表示即使当它们的位发生改变时图像不会被持续地画出﹔只有困像被完全加载后,图像才会显示出来。
    • awt . image . redrawrate决定动画的速率,其单位是ms。如果不设置该属性的话,其缺省值为100ms。
3、创建图像

AWT构件除了可以作为图像观察者之外,还有创建图像的能力。在java.awt.Component中,提供下面的两种方法用来创建图像:

  • createImage ( ImageProducer)
  • createImage (int width,int height)
    createImage ()的第一个版本来说,通过给定一个提供图像位的ImageProducer参数来创建图像。加载图像作为资源、创建图像的方法适用于画面外缓冲。

java.awt.Toolkit类也具有创建图像的能力。在该类中,提供了下面的三种创建图像的方法:

  • createlmage ( ImageProducer)
  • createImage (byte [ ] bits)
  • createImage (byte [ ] bits,int offset,int length)
    和AWT构件一样,Toolkit类在创建图像时,也是通过给定一个ImageProducer参数来实现的。另外,Toolkit类还提供两种方法,从 byte数组中创建图像。我们在后面将要讨论的“内存图像源”就是其中的一种方法,该方法是使用位数组创建图像。
4、加载图像作为资源

Java.lang.Class提供下面的两个方法加载资源:

  • URL getResource (String)
  • lnputStream getResourceAsStream (String)

1)上面两个方法为了加载资源,都授权给applet的类加载器。要注意的是所加载的资源不一定只是指图像,例如声音等也都可以作为资源被加载。
2)加载图像作为资源的好处是,可以防止图像不在程序中指定的位置。例如,考虑前面讲到过的程序片段:

URL codebase = gotCodeBase ();
Image im = getlmage ( codebase ,"saint.gif");//codebase保存从Applet . getCodeBase ()返回的 URL路径,其与 applet程序保存的位置有关。传递给applet . getImage ()的字符串指定相对于codebase文件

如果图像所在的image目录不在applet的codebase 下,应这样访问:

Image im = gotimage ( codebase , "imagos/saint . gif );

例子:

public class demo extends Applet {
    Image im;
    
    public void start(){
        URL url = getClass().getResource("globe.gif");
        im = createImage((ImageProducer)url.getContent());//getComtent获取URL相关的资源内容
        if(im == null){
            System.out.println("null image");
        }
    }
    
    public void paint(Graphics g){
        Insets insets = getInsets;
        g.drawImage(im,insets.left,insets.top,this);
    }
    
    public void update(Graphics g){
        paint(g);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值