第三十八节(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();//重新绘制
        }
    }
}
时间: 2024-10-06 05:49:49

第三十八节(java-实现GIF动画效果)的相关文章

centos shell编程4【分发系统】 第三十八节课

centos shell编程4[分发系统]  第三十八节课 http://www.cnblogs.com/MYSQLZOUQI/p/4811790.htmlmkpasswd 生成密码的工具,安装 expect包 yum install -y expect 上半节课 下半节课 f

Java进阶(三十五)java int与integer的区别

Java进阶(三十五)java int与integer的区别 前言 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象. 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前者而integer 是后者(也就是一个类):因此在类进行初始化时int类的变量初始为0.而Integer的变量则初始化为null. 2.初始化时: int i =1; Integer i= new In

第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理

第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行

【Android的从零单排开发日记】之入门篇(十六)——Android的动画效果

      什么是动画,动画的本质是通过连续不断地显示若干图像来产生“动”起来的效果.比如说一个移动的动画,就是在一定的时间段内,以恰当的速率(起码要12帧/秒以上,才会让人产生动起来的错觉)每隔若干时间在屏幕上更新一次位置.游戏中的动画效果也是由此而来.同样还有其他属性变更所引起的动画效果,从数学的角度来看,包括:(1)平移(2)旋转(3)缩放(4)透明度.当然这些属性可以组合起来使用,来达到更绚丽的画面.但是不论什么样的组合方式,我们都可以统一用Matirx运算来实现,从技术实现的角度来讲,

Java从零开始学三十五(JAVA IO- 字节流)

一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test.txt文件内容 abcdefg package com.pb.io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExcept

Java从零开始学三十六(JAVA IO- 字符流)

一.字符流 BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中 BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的满时,再把缓冲区的内容写到字符输出流中 二.对文本文件的读写 2.1.字符输入流 2.2.字符输出流 2.3.综合使用 package com.pb.io.buffered; import java.io.BufferedReader; import java.io.BufferedWriter;

Java从零开始学三十八(JAVA IO- 重定向IO)

一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重定向方法 方法 说明 static void setErr(PrintStream errr) 重定向标准错误输出流 static void setIn(InputStream in ) 重定向标准输入流 static void setOut(PrintStream out) 重定向歀输出流 三.例

Java从零开始学三十三四(JAVA IO-流简述)

一.流概念(stream) File类并不能对文件内容进行读写. 读文件就是指:把文件的内中的数据读取到内存中来 写文件就是指:把内存中的数据写入到文件中去. 通过什么读写文件呢?文件流. 1.1.流概念 一连串流动的字符 1.2.流的特性 先进先出的方式传递信息 一个字节序列 具有方向性:输入流.输出流 二.按照流向划分 输入流:读取数据--InputStream和Reader作为基类 输出流:写入数据--OutputStream和Writer作为基类 一共四个4基类. 其中InputStre

I学霸官方免费教程三十:Java集合框架之List集合

集合框架 在数组的使用过程中可以看到,想要向数组中插入元素和删除元素非常麻烦,而且数组的长度是无法改变的.java为我们提供了批量存储数据更加方便的容器,就是集合. 集合和数组的作用一样,都是为了使用一个变量来存储一批数据的:但集合使用起来更加方便,而且集合的长度是可以变化的. List接口 List集合可以存储有序的,可重复的数据: 常用的子类是ArrayList和LinkedList两个类 ArrayList类 这是一个底层由数组实现的集合类,是对数组进行了封装. 实例: package c