11 绘制雪花动态图

来源:互联网 发布:wifi信号搜索软件 编辑:程序博客网 时间:2024/05/16 13:49

前言

问题描述

接下来介绍一个好玩的, 绘制雪花的动态图
给定雪花的运动中的几张图片, 将其绘制到JPanel, 并动态的顺序的绘制各个图片, 形成一种 动画的即视感

思路

思路 : 使用一个线程定时的更新该位置的图片的索引, 定时重新绘制

参考代码

/** * file name : Test03DrawSnowFlake.java * created at : 10:21:16 AM Jun 13, 2015 * created by 970655147 */package com.hx.test06;public class Test03DrawSnowFlake {    // 雪花素材, 图片的个数    static Image SNOW_FLAKES[];    static int SNOW_FLAKE_NUM = 4;    static {        try {            SNOW_FLAKES = new Image[SNOW_FLAKE_NUM];            for(int i=0; i<SNOW_FLAKE_NUM; i++) {                SNOW_FLAKES[i] = ImageIO.read(new File("src/images/Test03DrawSnowFlake_snowFlake" + i + ".png"));            }        } catch (IOException e) {            e.printStackTrace();        }    }    // 绘制雪花    public static void main(String []args) {        // 各个雪花的初始状态, 位置, 大小        int[] idxes = new int[] {0, 2, 3, 1 };        Point[] poses = new Point[] {                 new Point(20, 20),                 new Point(100, 100),                new Point(200, 20),                new Point(200, 200)        };        Dimension[] dimenes = new Dimension[] {                new Dimension(40, 40),                new Dimension(40, 40),                new Dimension(20, 20),                new Dimension(20, 20)        };        // 创建窗口, 绘制雪花, 启动更新雪花状态的线程        JFrame frame = new JFrame();        MyPanel panel = new MyPanel(idxes, poses, dimenes);        frame.add(panel);        frame.setVisible(true);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.setBounds(100, 100, 400, 300);        frame.setResizable(false);        new Thread(new MyRunnable(panel)).start();    }    // Panel  用于显示雪花    static class MyPanel extends JPanel {        // 雪花的图片, 索引, 位置        int[] idxes;        Point[] poses;        Dimension[] dimenes;        // 初始化        public MyPanel(int[] idx, Point[] poses, Dimension[] dimenes) {            super();            if((idx.length != poses.length) || (poses.length != dimenes.length) ) {                throw new RuntimeException("idx'sLength must equals with poses'sLength & dimenes'sLength !");            }            this.idxes = idx;            this.poses = poses;            this.dimenes = dimenes;        }        // @Override, 绘制雪花        public void paint(Graphics g) {            super.paint(g);            g.setColor(Color.white);            g.fillRect(0, 0, 400, 300);            drawSnowFlake(g);        }        // 绘制num        private void drawSnowFlake(Graphics g) {            for(int i=0; i<idxes.length; i++) {                g.drawImage(SNOW_FLAKES[idxes[i]], poses[i].x, poses[i].y, dimenes[i].width, dimenes[i].height, null);            }        }        // 切换雪花的状态        public void switchSnowFlake() {            for(int i=0; i<idxes.length; i++ ) {                idxes[i] = (idxes[i] + 1) % SNOW_FLAKE_NUM;            }            repaint();        }    }    // 切换图片的周期    static int changeInterval = 100;    // 切换panel中的雪花状态的线程    static class MyRunnable implements Runnable {        MyPanel panel ;        // 初始化        public MyRunnable(MyPanel panel) {            super();            this.panel = panel;        }        // @Override, 切换雪花的状态        public void run() {            while(true) {                panel.switchSnowFlake();                Tools.sleep(changeInterval);            }        }    }}

效果截图

这里写图片描述

总结

瞎扯淡, 写着玩, 没什么技术含量。。

注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!

0 0
原创粉丝点击