使用Java显示图片2

上一节中,我们用Java显示了一张图片,这一节我们来尝试着用Java来显示一个超简单的动画。

 

先说点和代码无关的事情。动画的话,其实就是利用了人眼的视觉停留特性。如果眼前的画面以0.1秒的间隔来更换的话,就会给人一种画面在运动的感觉,小时候在书角画小人时利用的也是这一点。

 

首先,我们需要找一组连续起来的图片,制作过GIF动画图片的朋友应该体会的就更深一点。

 

代码方面是在第一节的基础上修改制成的,Main和MyFrame这两个类没有做修改。

 

 

面板源码:

[java]  view plain  copy
  1. package simple;  
  2.   
  3. import java.awt.Dimension;  
  4. import java.awt.Graphics;  
  5. import java.awt.Graphics2D;  
  6. import java.awt.Image;  
  7. import java.awt.Panel;  
  8. import java.awt.image.BufferedImage;  
  9.   
  10.   
  11.   
  12. public class MyPanel extends Panel implements Runnable{  
  13.       
  14.     private final int width=519;  
  15.       
  16.     private final int height=569;  
  17.       
  18.     private final Image screenImage = new BufferedImage(width, height, 2);  
  19.       
  20.     private final Graphics2D screenGraphic = (Graphics2D) screenImage.getGraphics();  
  21.       
  22.     private Image backgroundImage;  
  23.       
  24.     private Image[] images;  
  25.       
  26.     private int index;  
  27.       
  28.     private Thread animator;  
  29.       
  30.     public MyPanel() {  
  31.         loadImage();  
  32.         // 设定焦点在本窗体  
  33.         setFocusable(true);  
  34.         // 设定初始构造时面板大小,这里先采用图片的大小  
  35.         setPreferredSize(new Dimension(width,height));  
  36.         // 绘制背景  
  37.         drawView();  
  38.         animator=new Thread(this);  
  39.         start();  
  40.     }  
  41.       
  42.     private void start() {  
  43.         animator.start();  
  44.     }  
  45.   
  46.     /** 
  47.      * 载入图像 
  48.      */  
  49.     private void loadImage() {  
  50.         //因为图片更改了位置,所以换成用工具类来获取图片  
  51.         backgroundImage = FileUtility.getBackground();  
  52.         images = FileUtility.getImages("f");  
  53.     }  
  54.       
  55.     private void drawView() {  
  56.         screenGraphic.drawImage(backgroundImage, 00null);  
  57.     }  
  58.       
  59.     @Override  
  60.     public void update(Graphics g) {  
  61.         paint(g);  
  62.     }  
  63.       
  64.     public void paint(Graphics g) {  
  65.         int animWidth = images[index].getWidth(null);  
  66.         int animHeight = images[index].getHeight(null);  
  67.         screenGraphic.drawImage(images[index], (width - animWidth) / 2+5,(height - animHeight) / 2+5null); //图片选择的不太好,需要微调一下。如果选择了OK的图片就不必+5了  
  68.         g.drawImage(screenImage, 00null);  
  69.     }  
  70.   
  71.     public void run() {  
  72.         Thread me = Thread.currentThread();  
  73.         while (animator == me) {  
  74.             try {  
  75.                 Thread.sleep(100);  
  76.             } catch (InterruptedException e) {  
  77.                 break;  
  78.             }  
  79.             synchronized (this) {  
  80.                 index++;  
  81.                 if (index >= images.length) {  
  82.                     index = 0;  
  83.                 }  
  84.             }  
  85.             repaint();  
  86.         }  
  87.     }  
  88.       
  89. }  


 

 新增的工具类源码:

[java]  view plain  copy
  1. package simple;  
  2.   
  3. import java.awt.Image;  
  4. import java.io.File;  
  5.   
  6. import javax.swing.ImageIcon;  
  7.   
  8. public class FileUtility {  
  9.       
  10.     /** 
  11.      * 获得文件夹下*.png文件的个数 
  12.      *  
  13.      * @return 
  14.      */  
  15.     public static int getFileCount() {  
  16.         // 获得真实路径  
  17.         String userDir = System.getProperty("user.dir");  
  18.         // 获得文件分隔符(在 UNIX 系统中是"/")  
  19.         String se = System.getProperty("file.separator");  
  20.         File file= new File(userDir+se+"image");  
  21.         if (!file.isDirectory()) {  
  22.             return 0;  
  23.         }  
  24.         String[] fileStr = file.list();  
  25.         int count = 0;  
  26.         for (String s : fileStr) {  
  27.             String tail = s.substring(s.lastIndexOf("."), s.length()); // 小尾巴  
  28.             if (".png".equalsIgnoreCase(tail)) { //不区分大小写  
  29.                 count++;  
  30.             }  
  31.         }  
  32.         return count;  
  33.     }  
  34.       
  35.     public static Image getBackground() {  
  36.         String userDir = System.getProperty("user.dir");// 获得真实路径  
  37.         String se = System.getProperty("file.separator"); // 获得文件分隔符(在 UNIX 系统中是"/")  
  38.         ImageIcon icon = new ImageIcon(userDir+se+"image"+se+"background.png");  
  39.         if(icon.getImage().getWidth(null)<0) {  
  40.             return null//如果未找到图片则返回空  
  41.         }  
  42.         return icon.getImage();  
  43.     }  
  44.       
  45.     /** 
  46.      * 获得指定人物的动画效果图 
  47.      *  
  48.      * @param name 
  49.      * @return 
  50.      */  
  51.     static Image[] getImages(String name) {  
  52.         String userDir = System.getProperty("user.dir");// 获得真实路径  
  53.         String se = System.getProperty("file.separator"); // 获得文件分隔符(在 UNIX 系统中是"/")  
  54.         Image[] images=new Image[getFileCount()-1]; //减掉的1是背景图片  
  55.         for(int i=0;i<images.length;i++) {  
  56.             ImageIcon icon = new ImageIcon(userDir+se+"image"+se+"f"+i+".png");  
  57.             images[i]=icon.getImage();  
  58.         }  
  59.         return images;  
  60.     }  
  61.       
  62.     /** 测试用主方法 */  
  63.     public static void main(String[] args) {  
  64.         System.out.println(getFileCount());  
  65.     }  
  66.   
  67. }  



 

 

在MyPanel类中引入了线程,每0.1秒从图片数组中取出下一次元素刷新一次画面

 

总结:这几个类其实写的很粗糙,最多只是抛砖引玉喽。

 

源代码:http://download.csdn.net/detail/w93223010/4529090




FROM: http://blog.csdn.net/w93223010/article/details/7912606

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值