📄 imageset.java
字号:
package com.thinkenjoy.tools;
import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
//#if NOK_7260 || NOK_7210 || NOK_6101 || NOK_6230i || NOK_7370 || NOK_QD
//# import com.nokia.mid.ui.DirectUtils;
//#endif
/**
*
* 图片帧的容器
* 此类主要是负责一些图片处理方面的事务
*/
public class ImageSet {
private int totalStates; // 只被addState方法调用
private Image[][] stateFrames;
private int[] stateAnimTime, stateFrameWidth, stateFrameHeight;
/**
* 构造函数,初始化相应数组
*
* @param numStates
*/
public ImageSet(int numStates) {
stateAnimTime = new int[numStates];
stateFrameWidth = new int[numStates];
stateFrameHeight = new int[numStates];
stateFrames = new Image[numStates][];
}
/**
* 添加新的图片序列状态,
* @param frames
* 图片帧数组
* @param animTime
* 整个图片帧数组的显示时间
*/
public final void addState(Image frames[], int animTime) {
int state = totalStates++;
if (state >= stateFrames.length) {
// 扩大状态的数量
stateAnimTime = Tools.expandArray(stateAnimTime, 1);
stateFrameWidth = Tools.expandArray(stateFrameWidth, 1);
stateFrameHeight = Tools.expandArray(stateFrameHeight, 1);
stateFrames = Tools.expandArray(stateFrames, 1);
}
stateAnimTime[state] = animTime;
stateFrameWidth[state] = frames[0].getWidth();
stateFrameHeight[state] = frames[0].getHeight();
stateFrames[state] = frames;
}
/**
* 获得指定状态下的图片帧数量
*
* @param state
* 某一状态
* @return 指定状态下的图片帧数量
*/
public final int getTotalFrames(int state) {
return stateFrames[state].length;
}
/**
* 获得相应状态的持续总时间 注:并不是每帧的延迟时间
*
* @param state
* 相应状态
* @return 持续总时间
*/
public final int getAnimTime(int state) {
return stateAnimTime[state];
}
/**
* 获得每帧的延迟时间
*
* @param state
* 相应状态
* @return 每帧的延迟时间
*/
public final int getAnimTimePerFrame(int state) {
return stateAnimTime[state] / stateFrames[state].length;
}
/**
* 在画布上画相应状态的相应帧
*
* @param target
* 相应画布
* @param state
* 相应状态
* @param frame
* 相应帧
* @param targetX
* 绘制帧的相应X坐标
* @param targetY
* 绘制帧的相应Y坐标
*/
public final void draw(Graphics target, int state, int frame, int targetX,
int targetY) {
if (stateFrames[state][frame] != null) {
target.drawImage(stateFrames[state][frame], targetX, targetY,
Tools.GRAPHICS_TOP_LEFT);
}
}
/**
* 提取出相应状态相应帧的图片
*
* @param state
* 相应状态
* @param frame
* 相应帧
* @return
*/
public final Image getFrame(int state, int frame) {
return stateFrames[state][frame];
}
/**
* 得到一张图片的相应裁剪区域
*
* @param filename
* 图片文件的名字
* @param originX
* 裁剪区域的起始X坐标
* @param originY
* 裁剪区域的起始Y坐标
* @param width
* 裁剪区域的宽度
* @param height
* 裁剪区域的高度
* @return 裁剪区域的图片
*/
public final static Image loadClippedImage(String filename, int originX,
int originY, int width, int height) {
try {
// 载入整张图片
Image fileImage = Image.createImage(filename);
// 用getImageRegion方法用以提取出想要的图片
return getImageRegion(fileImage, originX, originY, width, height);
}
catch (IOException ioe) {
System.out.println("can't load file: " + filename);
return null;
}
}
/**
* 得到一张图片的相应裁剪区域(从相应的位置起裁剪原始图片的剩余部分)
*
* @param filename
* 图片文件的名字
* @param originX
* 裁剪区域的起始X坐标
* @param originY
* 裁剪区域的起始Y坐标
* @return 裁剪区域的图片
*/
public final static Image loadClippedImage(String filename, int originX,
int originY) {
try {
// 载入整张图片
Image fileImage = Image.createImage(filename);
// 如果只是完整地载入一张图片
if (originX == 0 && originY == 0)
return fileImage;
// 得到我们想要的图片区域
return getImageRegion(fileImage, originX, originY, fileImage
.getWidth(), fileImage.getHeight());
}
catch (IOException ioe) {
System.out.println("can't load file: " + filename);
return null;
}
}
/**
* 在原始图片上剪切出一张新图片
*
* @param source 原始图片
* @param x
* 新图片在原始图片上的起始X坐标
* @param y
* 新图片在原始图片上的起始Y坐标
* @param width
* 新图片的宽度
* @param height
* 新图片的高度
* @return 仅仅包含原始图片部分的新图片
*/
public final static Image getImageRegion(Image source, int x, int y,
int width, int height) {
//#ifdef debug
//# if (x + width > source.getWidth() || y + height > source.getHeight())
//# System.out.println("Warning: attempting extract using (" + x + ","
//# + y + "," + width + "," + height + ") when image is " + "("
//# + source.getWidth() + "," + source.getHeight() + ")");
//#endif
// 为新图片创建一张空白图片
//#if NOK_7260 || NOK_7210 || NOK_6101 || NOK_6230i || NOK_7370
//# Image result = DirectUtils.createImage(width, height, 0);
//# // 在空白图片上根据相应位置绘制
//# result.getGraphics().drawImage(source, -x, -y, Tools.GRAPHICS_TOP_LEFT);
//#else
Image result = Image.createImage(source, x, y, width, height, 0x00000000);
//#endif
return result;
}
/**
* 分离帧
*
* @param sourceImage
* 原始合并图片
* @param sourceX
* 原始图片的分离起始X坐标
* @param sourceY
* 原始图片的分离起始Y坐标
* @param framesWide
* 横向的分离数量
* @param framesHigh
* 纵向的分离数量
* @param frameWidth
* 每帧的宽度
* @param frameHeight
* 每帧的高度
* @return 存储每帧图片的数组
*/
public final static Image[] extractFrames(Image sourceImage, int sourceX,
int sourceY, int framesWide,
int framesHigh, int frameWidth,
int frameHeight) {
// 存储每帧图片的数组
Image[] frames = new Image[framesWide * framesHigh];
int frameCount = 0;
for (int fy = 0; fy < framesHigh; fy++)
for (int fx = 0; fx < framesWide; fx++)
frames[frameCount++] = getImageRegion(sourceImage,
sourceX + (fx * frameWidth),
sourceY + (fy * frameHeight),
frameWidth, frameHeight);
return frames;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -