第三十八节(java-实现GIF动画效果)
package com.tanzhou.test; import java.applet.Applet; import java.awt.*; import java.net.MalformedURLException; import java.net.URL; /** * 在java中有两种方式实现多线程,一种是继承 Thread类,一种是实现Runnable接口; * @author Administrator * *在实际的开发中可定是以Runnable接口为主 * *1、画界面 2、绘制界面(显示静态时间) 3、调用线程刷新界面 * * *1.applet是一种不能单独运行但可嵌入在其他应用程序中的小程序 2.该类直接继承于java.awt.Panel类,其直接子类为javax.swing.JApplet */ public class Animation extends Applet implements Runnable { Image igs[]; //用于装载组成GIF动画的JPG图片 Thread th; //声明了线程对象 int MAX_hight = 200, MAX_width = 200;//定义了程序界面的大小 Image image; //声明了一个图片 ;是一个抽象类,是表示图形图像的所有类的超类 Graphics gh;//声明了一个Graphics对象 是所有图形上下文的抽象基类,允许应用程序可以在组件 以及图像上进行绘制 MediaTracker mt;//声明了一个MediaTracker对象 ;是一个跟踪多种媒体对象状态的使用工具类,目前仅支持图像 boolean flag = false;//其作用是标志图片是否加载成功 int id = 0;//定义了一个图象索引 public static void main(String[] args) { new Animation(); } /** * public void init():由浏览器或applet viewer调用,通知当前applet它已经被加载到系统中,它经常在第一次调用start方法前调用; Applet的子类可以重写该方法,并在该方法中执行一些初始化操作 */ public void init() { igs = new Image[8];//对图像数组进行实例化,其长度为8 mt = new MediaTracker(this);//对媒体跟踪器mt进行实例化 image = this.createImage(MAX_width, MAX_hight);//创建一个用于双缓冲的、可在屏幕外绘制的图像image gh = image.getGraphics();//对图形对象gh进行实例化 gh.setColor(Color.white);//将gh图形的当前颜色设置成白色 gh.fillRect(0, 0, MAX_width, MAX_hight);//指定要绘制的矩形的位置和大小 this.setSize(MAX_width, MAX_hight);//设置Applet的尺寸 for (int i = 0; i < igs.length; i++) {//此循环的目的是获取每个JPG图片,并将其放入到mt中 String file_name = (i + 1) + ".jpg"; igs[i] = this.getImage(getCodeBase(), file_name); mt.addImage(igs[i], i); } try { mt.waitForAll();//开始加载由此媒体跟踪器跟踪的所有图像,也就是那些JPG图片 } catch (InterruptedException e) { e.printStackTrace(); } flag = true;//将标识改成true,即加载完毕 } public void paint(Graphics g) { if (flag) {//判断加载否完毕 g.drawImage(image, 0, 0, this);//画出由上面定义好了的矩形 } } /** * public void start():由浏览器或applet viewer调用,通知当前applet它应该开始执行,它经常在init()方法调用后以及在Web页中 每次重新访问applet时调用 */ public void start() { if (mt.checkID(id)) {//判断处于id位置的图像是否加载完毕 gh.drawImage(igs[id], 0, 0, this);//画出该图像 } th = new Thread(this);//为线程th实例化 th.start();//启动线程 } public void run() { while ((th != null)) { if (mt.checkID(id)) {//判断处于id位置的图像是否加载完毕 gh.fillRect(0, 0, MAX_width, MAX_hight);//指定要绘制的矩形的位置和大小 gh.drawImage(igs[id], 0, 0, this);//画出于id位置的图像 id++;//id加1 if (id >= igs.length) { //如果图像绘制完毕 id = 0;//id清零 } } try { th.sleep(150);//线程休眠0.1秒 } catch (InterruptedException e) { } this.repaint();//重新绘制 } } }