www.pudn.com > circumgyrate.rar > ViewCanvas.java
//package com.circumgyrate; import javax.microedition.lcdui.*; /** *Title:
*Description:
*Copyright: Copyright (c) 2004
*Company:
* @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(); } }