📄 scrollcanvas.java
字号:
/**
*
* @author Sam Huang
*
*/
import java.util.Timer;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
public class ScrollCanvas extends Canvas implements CommandListener, Runnable {
private static final int VH_CENTER = Graphics.VCENTER | Graphics.HCENTER;
private Command nextCommand = new Command("下一张", Command.OK, 10);
private Command perviousCommand = new Command("上一张", Command.OK, 20);
private Command turn90Command = new Command("90度旋转", Command.OK, 30);
private Command turn180Command = new Command("180度旋转", Command.OK, 32);
private Command horizontalMirrorCommand = new Command("水平镜像", Command.OK,
33);
private Command verticalMirrorCommand = new Command("垂直镜像", Command.OK, 36);
private Command zoomInCommand = new Command("放大", Command.OK, 40);
private Command zoomOutCommand = new Command("缩小", Command.OK, 45);
private Command thumbNailsCommand = new Command("显示为图标(ThumbNails)",
Command.OK, 48);
private Command fadingCommand = new Command("渐进渐出", Command.OK, 60);
private Command reverseRGBCommand = new Command("颜色反转", Command.OK, 65);
private Command grayRGBCommand = new Command("灰度转换一", Command.OK, 66);
private Command grayRGB2Command = new Command("灰度转换二", Command.OK, 67);
private Command darkleCommand = new Command("变暗", Command.OK, 68);
private Command whitenCommand = new Command("变亮", Command.OK, 69);
private Command saveCommand = new Command("保存图像(RMS)", Command.OK, 70);
// 菜单项太多了,这个功能不是重点,忽略
// private Command saveBgCommand = new Command("保存背景(RMS)", Command.OK, 70);
private Command memoryCommand = new Command("内存信息", Command.OK, 75);
private Command backCommand = new Command("返回", Command.BACK, 80);
private Image image;
private int imgX;
private int imgY;
private static int MOVE_IMAGE_OFF = 5;
private static int CHANGE_BGCOLOR_OFF = 5;
private static int CHANGE_IMAGECOLOR_OFF = 5;
private int changeAlphaOff = 15;
private int darkleEnd = 255;
private int RED = 0;
private int GREEN = 0;
private int BLUE = 0;
// timer task delay between repeating
private static final int KEY_DELAY = 200; // 0.2 secs
// key repeating timer and task
private Timer timer;
private KeyRepeatTask keyRepeatTask;
private boolean upKeyPressed = false;
private boolean downKeyPressed = false;
private boolean leftKeyPressed = false;
private boolean rightKeyPressed = false;
private boolean num1KeyPressed = false;
private boolean num3KeyPressed = false;
private boolean num5keyPressed = false;
private boolean mTrucking = true;
private boolean mUpdate = true;
private int mAlpha = 255;
private Image originalImage;// 调整明暗时用到
private int[] rawInt; // 存储图像RGB的数组
public ScrollCanvas(Image img) {
this.setFullScreenMode(true);
this.addCommand(this.nextCommand);
this.addCommand(this.perviousCommand);
this.addCommand(this.turn90Command);
this.addCommand(this.turn180Command);
this.addCommand(this.horizontalMirrorCommand);
this.addCommand(this.verticalMirrorCommand);
this.addCommand(this.zoomInCommand);
this.addCommand(this.zoomOutCommand);
this.addCommand(this.thumbNailsCommand);
this.addCommand(this.fadingCommand);
this.addCommand(this.reverseRGBCommand);
this.addCommand(this.saveCommand);
// this.addCommand(this.saveBgCommand);
this.addCommand(this.grayRGBCommand);
this.addCommand(this.grayRGB2Command);
this.addCommand(this.darkleCommand);
this.addCommand(this.whitenCommand);
this.addCommand(this.memoryCommand);
this.addCommand(backCommand);
this.setCommandListener(this);
this.image = img;
this.imgX = this.getWidth() / 2;
this.imgY = this.getHeight() / 2;
// 保存原来的一份拷贝
this.originalImage = Image.createImage(this.image);
// *******************************************************************
try {
// 获得图像的ARGB数据,存储在rawInt里
rawInt = new int[this.image.getWidth() * image.getHeight()];
this.image.getRGB(rawInt, 0, image.getWidth(), 0, 0, image
.getWidth(), image.getHeight());
} catch (OutOfMemoryError e) {
// 忽略,可能是图像太大
}
// *******************************************************************
setKeyRepetition();
repaint();
}
private void setKeyRepetition()
/*
* 如果移动设备不支持重复按键事件,启动一个后台线程来支持它
*/
{
if (this.hasRepeatEvents()) {
// 支持,什么也不做
// System.out.println("支持重复按键事件");
} else {
// System.out.println("不支持重复按键事件");
// 开始后台线程
keyRepeatTask = new KeyRepeatTask(this);
timer = new Timer();
timer.schedule(keyRepeatTask, 0, KEY_DELAY);
}
}
public void paint(Graphics graphics) {
graphics.setColor(RED, GREEN, BLUE);
// graphics.setGrayScale(0);
// System.out.println("Red = " + graphics.getRedComponent( ) + ", green
// = " + graphics.
// getGreenComponent( ) + ", blue = " + graphics.getBlueComponent( ));
graphics.fillRect(0, 0, getWidth(), getHeight());
graphics.drawImage(image, imgX, imgY, VH_CENTER);
mUpdate = true;
}
/**
*
* 通过改变RGB来改变背景的颜色
*/
void changeBgValue(int keyCode) {
switch (keyCode) {
case '1':
RED += CHANGE_BGCOLOR_OFF;
RED %= 255;
break;
case '3':
GREEN += CHANGE_BGCOLOR_OFF;
GREEN %= 255;
break;
case '5':
BLUE += CHANGE_BGCOLOR_OFF;
BLUE %= 255;
break;
}
}
/**
*
* 通过改变RGB来改变图片的颜色, 执行的时候我发现图片颜色的改变很奇怪,连续点击后有时造成死机,而且有些off值不起作用
* 我自己的分析是模拟器显示图像的分辨率并不支持0-255来显示,因此有些值就不起作用了
* 我没有研究过图像处理,因此可能方法不正确,希望有兴趣的朋友帮忙改进
*/
void changeImageValue(int keyCode) {
switch (keyCode) {
case '0':
ImageEffect.blendRGB(this.rawInt, CHANGE_IMAGECOLOR_OFF, 0);
break;
case '7':
ImageEffect.blendRGB(this.rawInt, CHANGE_IMAGECOLOR_OFF, 1);
break;
case '9':
ImageEffect.blendRGB(this.rawInt, CHANGE_IMAGECOLOR_OFF, 2);
break;
}
if (rawInt != null) {
image = Image.createRGBImage(rawInt, this.image.getWidth(),
this.image.getHeight(), true);
repaint();
} else {
ImageAlbum.showAlert("图像尺寸太大,不能完成此操作.");
}
}
/*
* 响应按键事件移动图片的方法
*
*/
public void keyReleased(int keyCode) {
int gameKey = getGameAction(keyCode);
if ((gameKey == UP) || (keyCode == KEY_NUM2)) {
imgY += MOVE_IMAGE_OFF;
this.upKeyPressed = false;
} else if ((gameKey == LEFT) || (keyCode == KEY_NUM4)) {
imgX -= MOVE_IMAGE_OFF;
this.leftKeyPressed = false;
} else if ((gameKey == RIGHT) || (keyCode == KEY_NUM6)) {
imgX += MOVE_IMAGE_OFF;
this.rightKeyPressed = false;
} else if ((gameKey == DOWN) || (keyCode == KEY_NUM8)) {
imgY -= MOVE_IMAGE_OFF;
this.downKeyPressed = false;
} else if (keyCode == KEY_NUM1) {
this.num1KeyPressed = false;
changeBgValue(keyCode);
} else if (keyCode == KEY_NUM3) {
this.num3KeyPressed = false;
changeBgValue(keyCode);
} else if (keyCode == KEY_NUM5) {
this.num5keyPressed = false;
changeBgValue(keyCode);
} else if (keyCode == KEY_NUM0) {
this.changeImageValue(keyCode);
} else if (keyCode == KEY_NUM7) {
this.changeImageValue(keyCode);
} else if (keyCode == KEY_NUM9) {
this.changeImageValue(keyCode);
}
repaint();
serviceRepaints();
}
/*
* 响应按键事件重复移动图片或者改变背景色的方法,仅在移动设备支持重复按键事件时才有效
*
*/
public synchronized void keyRepeated(int keyCode) {
int gameKey = getGameAction(keyCode);
if ((gameKey == UP) || (keyCode == KEY_NUM2)) {
imgY += MOVE_IMAGE_OFF;
} else if ((gameKey == LEFT) || (keyCode == KEY_NUM4)) {
imgX -= MOVE_IMAGE_OFF;
} else if ((gameKey == RIGHT) || (keyCode == KEY_NUM6)) {
imgX += MOVE_IMAGE_OFF;
} else if ((gameKey == DOWN) || (keyCode == KEY_NUM8)) {
imgY -= MOVE_IMAGE_OFF;
} else if (keyCode == KEY_NUM1) {
changeBgValue(keyCode);
} else if (keyCode == KEY_NUM3) {
changeBgValue(keyCode);
} else if (keyCode == KEY_NUM5) {
changeBgValue(keyCode);
}
repaint();
serviceRepaints();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -