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

📄 viewcanvas.java

📁 一个midp1.0图片旋转的原程序
💻 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 + -