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);
}
}