使用Java显示图片2
2016-05-12 23:20
447 查看
上一节中,我们用Java显示了一张图片,这一节我们来尝试着用Java来显示一个超简单的动画。
先说点和代码无关的事情。动画的话,其实就是利用了人眼的视觉停留特性。如果眼前的画面以0.1秒的间隔来更换的话,就会给人一种画面在运动的感觉,小时候在书角画小人时利用的也是这一点。
首先,我们需要找一组连续起来的图片,制作过GIF动画图片的朋友应该体会的就更深一点。
代码方面是在第一节的基础上修改制成的,Main和MyFrame这两个类没有做修改。
面板源码:
[java] view
plain copy
package simple;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Panel;
import java.awt.image.BufferedImage;
public class MyPanel extends Panel implements Runnable{
private final int width=519;
private final int height=569;
private final Image screenImage = new BufferedImage(width, height, 2);
private final Graphics2D screenGraphic = (Graphics2D) screenImage.getGraphics();
private Image backgroundImage;
private Image[] images;
private int index;
private Thread animator;
public MyPanel() {
loadImage();
// 设定焦点在本窗体
setFocusable(true);
// 设定初始构造时面板大小,这里先采用图片的大小
setPreferredSize(new Dimension(width,height));
// 绘制背景
drawView();
animator=new Thread(this);
start();
}
private void start() {
animator.start();
}
/**
* 载入图像
*/
private void loadImage() {
//因为图片更改了位置,所以换成用工具类来获取图片
backgroundImage = FileUtility.getBackground();
images = FileUtility.getImages("f");
}
private void drawView() {
screenGraphic.drawImage(backgroundImage, 0, 0, null);
}
@Override
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
int animWidth = images[index].getWidth(null);
int animHeight = images[index].getHeight(null);
screenGraphic.drawImage(images[index], (width - animWidth) / 2+5,(height - animHeight) / 2+5, null); //图片选择的不太好,需要微调一下。如果选择了OK的图片就不必+5了
g.drawImage(screenImage, 0, 0, null);
}
public void run() {
Thread me = Thread.currentThread();
while (animator == me) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
break;
}
synchronized (this) {
index++;
if (index >= images.length) {
index = 0;
}
}
repaint();
}
}
}
新增的工具类源码:
[java] view
plain copy
package simple;
import java.awt.Image;
import java.io.File;
import javax.swing.ImageIcon;
public class FileUtility {
/**
* 获得文件夹下*.png文件的个数
*
* @return
*/
public static int getFileCount() {
// 获得真实路径
String userDir = System.getProperty("user.dir");
// 获得文件分隔符(在 UNIX 系统中是"/")
String se = System.getProperty("file.separator");
File file= new File(userDir+se+"image");
if (!file.isDirectory()) {
return 0;
}
String[] fileStr = file.list();
int count = 0;
for (String s : fileStr) {
String tail = s.substring(s.lastIndexOf("."), s.length()); // 小尾巴
if (".png".equalsIgnoreCase(tail)) { //不区分大小写
count++;
}
}
return count;
}
public static Image getBackground() {
String userDir = System.getProperty("user.dir");// 获得真实路径
String se = System.getProperty("file.separator"); // 获得文件分隔符(在 UNIX 系统中是"/")
ImageIcon icon = new ImageIcon(userDir+se+"image"+se+"background.png");
if(icon.getImage().getWidth(null)<0) {
return null; //如果未找到图片则返回空
}
return icon.getImage();
}
/**
* 获得指定人物的动画效果图
*
* @param name
* @return
*/
static Image[] getImages(String name) {
String userDir = System.getProperty("user.dir");// 获得真实路径
String se = System.getProperty("file.separator"); // 获得文件分隔符(在 UNIX 系统中是"/")
Image[] images=new Image[getFileCount()-1]; //减掉的1是背景图片
for(int i=0;i<images.length;i++) {
ImageIcon icon = new ImageIcon(userDir+se+"image"+se+"f"+i+".png");
images[i]=icon.getImage();
}
return images;
}
/** 测试用主方法 */
public static void main(String[] args) {
System.out.println(getFileCount());
}
}
在MyPanel类中引入了线程,每0.1秒从图片数组中取出下一次元素刷新一次画面
总结:这几个类其实写的很粗糙,最多只是抛砖引玉喽。
源代码:http://download.csdn.net/detail/w93223010/4529090
FROM: http://blog.csdn.net/w93223010/article/details/7912606
先说点和代码无关的事情。动画的话,其实就是利用了人眼的视觉停留特性。如果眼前的画面以0.1秒的间隔来更换的话,就会给人一种画面在运动的感觉,小时候在书角画小人时利用的也是这一点。
首先,我们需要找一组连续起来的图片,制作过GIF动画图片的朋友应该体会的就更深一点。
代码方面是在第一节的基础上修改制成的,Main和MyFrame这两个类没有做修改。
面板源码:
[java] view
plain copy
package simple;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Panel;
import java.awt.image.BufferedImage;
public class MyPanel extends Panel implements Runnable{
private final int width=519;
private final int height=569;
private final Image screenImage = new BufferedImage(width, height, 2);
private final Graphics2D screenGraphic = (Graphics2D) screenImage.getGraphics();
private Image backgroundImage;
private Image[] images;
private int index;
private Thread animator;
public MyPanel() {
loadImage();
// 设定焦点在本窗体
setFocusable(true);
// 设定初始构造时面板大小,这里先采用图片的大小
setPreferredSize(new Dimension(width,height));
// 绘制背景
drawView();
animator=new Thread(this);
start();
}
private void start() {
animator.start();
}
/**
* 载入图像
*/
private void loadImage() {
//因为图片更改了位置,所以换成用工具类来获取图片
backgroundImage = FileUtility.getBackground();
images = FileUtility.getImages("f");
}
private void drawView() {
screenGraphic.drawImage(backgroundImage, 0, 0, null);
}
@Override
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
int animWidth = images[index].getWidth(null);
int animHeight = images[index].getHeight(null);
screenGraphic.drawImage(images[index], (width - animWidth) / 2+5,(height - animHeight) / 2+5, null); //图片选择的不太好,需要微调一下。如果选择了OK的图片就不必+5了
g.drawImage(screenImage, 0, 0, null);
}
public void run() {
Thread me = Thread.currentThread();
while (animator == me) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
break;
}
synchronized (this) {
index++;
if (index >= images.length) {
index = 0;
}
}
repaint();
}
}
}
新增的工具类源码:
[java] view
plain copy
package simple;
import java.awt.Image;
import java.io.File;
import javax.swing.ImageIcon;
public class FileUtility {
/**
* 获得文件夹下*.png文件的个数
*
* @return
*/
public static int getFileCount() {
// 获得真实路径
String userDir = System.getProperty("user.dir");
// 获得文件分隔符(在 UNIX 系统中是"/")
String se = System.getProperty("file.separator");
File file= new File(userDir+se+"image");
if (!file.isDirectory()) {
return 0;
}
String[] fileStr = file.list();
int count = 0;
for (String s : fileStr) {
String tail = s.substring(s.lastIndexOf("."), s.length()); // 小尾巴
if (".png".equalsIgnoreCase(tail)) { //不区分大小写
count++;
}
}
return count;
}
public static Image getBackground() {
String userDir = System.getProperty("user.dir");// 获得真实路径
String se = System.getProperty("file.separator"); // 获得文件分隔符(在 UNIX 系统中是"/")
ImageIcon icon = new ImageIcon(userDir+se+"image"+se+"background.png");
if(icon.getImage().getWidth(null)<0) {
return null; //如果未找到图片则返回空
}
return icon.getImage();
}
/**
* 获得指定人物的动画效果图
*
* @param name
* @return
*/
static Image[] getImages(String name) {
String userDir = System.getProperty("user.dir");// 获得真实路径
String se = System.getProperty("file.separator"); // 获得文件分隔符(在 UNIX 系统中是"/")
Image[] images=new Image[getFileCount()-1]; //减掉的1是背景图片
for(int i=0;i<images.length;i++) {
ImageIcon icon = new ImageIcon(userDir+se+"image"+se+"f"+i+".png");
images[i]=icon.getImage();
}
return images;
}
/** 测试用主方法 */
public static void main(String[] args) {
System.out.println(getFileCount());
}
}
在MyPanel类中引入了线程,每0.1秒从图片数组中取出下一次元素刷新一次画面
总结:这几个类其实写的很粗糙,最多只是抛砖引玉喽。
源代码:http://download.csdn.net/detail/w93223010/4529090
FROM: http://blog.csdn.net/w93223010/article/details/7912606
相关文章推荐
- 使用Java显示图片
- 第一个Java程序,简单的打开图片并显示在面板上
- Spring JMS---三种消息监听器
- JPA规范介绍及实例(Java数据持久化解决方案)
- Java for-each循环
- java中带继承类的加载顺序详解及实战
- spring基础知识汇总及常见面试题目总结
- Java上传下载excel、解析Excel、生成Excel的问题
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
- Java 版 (精华区)--Frame和Panel的区别【转载
- 两个java数组删除相同元素
- HDU 1042 N! (大数阶乘,紫书上的方法超时!!还是Java大法好!!)
- Windows 10 Java环境变量配置
- 浅析Java虚拟机结构与机制
- Java基础之static和final的用法
- eclipse运行go文件,报错“Resource donesnt have a corresponding Go paceage.”
- Java Web中内置对象--response重定向
- Java中的集合总结
- JAVA 就六次作业 抽奖
- Java第二次听课笔记(20160512)