📄 viewcanvas.java
字号:
//package com.circumgyrate;
import javax.microedition.lcdui.*;
/**
* <P>Title: </P>
* <P>Description: </P>
* <P>Copyright: Copyright (c) 2004</P>
* <P>Company: </P>
* @author not attributable
* @version 1.0
*/
public class ViewCanvas
extends Canvas
implements CommandListener, Runnable {
private Command cmExit; // Exit midlet
private String keyText = "0"; // Key code text,用来记录用户的击键,在这个例子里不使用
private int angle = 0; // 旋转的角度
private Image originImage; // 原始图像
private circumgyrate midlet;
private boolean alive = true;
private int interval = 100;
private Thread thread = null;
/*--------------------------------------------------
* Constructor
*-------------------------------------------------*/
public ViewCanvas(circumgyrate midlet) {
this.midlet = midlet;
try {
originImage = Image.createImage("/start.png");
}
catch (Exception e) {
System.out.println("load image fail!!!!!");
}
// Create exit command and listen for events
cmExit = new Command("退出", Command.EXIT, 1);
addCommand(cmExit);
setCommandListener(this);
thread = new Thread(this);
thread.start();
}
// 这是一个把图像绕中心点旋转一个角度的程序代码
// OriginImage传入原始图像,函数的返回值是旋转后的图像
// 这段代码只能旋转30度的整数倍角度,如果要旋转更精细
// 改一下tabCos,tabSin就行了,这两个数组保存的是cos和sin乘于4096的值
// 由于j2me不支持符点运算以及三角函数,所以用查表的方式计算sin,cos
int[] tabCos = {
4096, 3547, 2048, 0, -2048, -3547, -4096, -3547, -2048, 0, 2048, 3547};
int[] tabSin = {
0, 2048, 3547, 4096, 3547, 2048, 0, -2048, -3547, -4096, -3547, -2048};
private Image TransferImage(Image OriginImage, int angle) {
int w = OriginImage.getWidth();
int h = OriginImage.getHeight();
int ARGBData[] = new int[w * h];
int TranARGBData[] = new int[w * h];
OriginImage.getRGB(ARGBData, 0, w, 0, 0, w, h);
int centerX = w / 2;
int centerY = h / 2;
int i = ( (360 - angle) % 360) / 30;
for (int y1 = 0; y1 < h; y1++) {
for (int x1 = 0; x1 < w; x1++) {
// 这是坐标变换,不清楚的同志查一下坐标变换公式吧
int x2 = ( ( (x1 - centerX) * tabCos[i]) >> 12) -
( ( (y1 - centerY) * tabSin[i]) >> 12) + centerX;
int y2 = ( ( (x1 - centerX) * tabSin[i]) >> 12) +
( ( (y1 - centerY) * tabCos[i]) >> 12) + centerY;
if ( (x2 >= 0) && (x2 < w) && (y2 >= 0) && (y2 < h)) {
TranARGBData[y1 * w + x1] = ARGBData[y2 * w + x2];
}
else {
TranARGBData[y1 * w + x1] = 255 << 24;
}
}
}
return Image.createRGBImage(TranARGBData, w, h, true);
}
/*--------------------------------------------------
* Paint the text representing the key code
*-------------------------------------------------*/
protected void paint(Graphics g) {
// Clear the background (to white)
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(TransferImage(originImage, angle), 0, 0,
Graphics.TOP | Graphics.LEFT);
angle = (angle + 30) % 360; // 下一个旋转角度
}
public void run() {
while (true) {
if (alive) {
repaint();
try {
Thread.sleep(interval);
}
catch (InterruptedException e) {
}
}
}
}
/*--------------------------------------------------
* Command event handling
*-------------------------------------------------*/
public void commandAction(Command c, Displayable d) {
if (c == cmExit) {
midlet.exitMIDlet();
}
}
/*--------------------------------------------------
* Key code event handling
*-------------------------------------------------*/
protected void keyPressed(int keyCode) {
keyText = getKeyName(keyCode);
repaint();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -