zoukankan      html  css  js  c++  java
  • 第三十八节(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();//重新绘制
            }
        }
    }
  • 相关阅读:
    正则表达式例子
    addevent兼容函数 && 阻止默认行为 && 阻止传播
    addevent
    区分总结innerHeight与clientHeight、innerWidth与clientWidth、scrollLeft与pageXOffset等属性
    setattribute兼容
    随机分配位置
    浏览器类型
    统计一个字符串中相同字符的个数
    Appium发送中文或其他语言的问题
    Appium同时连接多台手机进行测试(多线程)
  • 原文地址:https://www.cnblogs.com/Deng1185246160/p/4279787.html
Copyright © 2011-2022 走看看