⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scrollcanvas.java

📁 j2me 图象缩小和放大。自动适应屏幕大小
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 * 
 * @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 + -