首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

MIDP Canvas 繪製可修改圖像:MutableImage 完整範例

     編輯:J2ME

MutableImage 與 ImmutableImage

MIDP 中 Image 分兩種:

  • Immutable(不可變):Image.createImage("/file.png")、createImage(InputStream) 產生,唯讀,可跨執行緒安全共享。
  • Mutable(可變):Image.createImage(width, height) 產生離屏緩衝,可取得 Graphics 任意繪製,再以 drawImage 送上螢幕。

可變圖像適用於:動態生成 UI 元件、遊戲雙緩衝、文字渲染至圖像後重複使用(避免每幀呼叫 drawString)。

完整範例:離屏繪製圓角矩形按鈕

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class MutableImageWithCanvas extends MIDlet {
    private Display display;
    private ImageCanvas canvas;

    public MutableImageWithCanvas() {
        display = Display.getDisplay(this);
        canvas = new ImageCanvas(this);
    }
    protected void startApp() { display.setCurrent(canvas); }
    protected void pauseApp() {}
    protected void destroyApp(boolean u) {}
    public void exitMIDlet() { destroyApp(true); notifyDestroyed(); }
}

class ImageCanvas extends Canvas implements CommandListener {
    private MutableImageWithCanvas midlet;
    private Command cmExit;
    private Image mutableImg;
    private String message = "Core J2ME";

    public ImageCanvas(MutableImageWithCanvas midlet) {
        this.midlet = midlet;
        cmExit = new Command("Exit", Command.EXIT, 1);
        addCommand(cmExit);
        setCommandListener(this);

        try {
            // 1. 建立可變圖像 80x20
            mutableImg = Image.createImage(80, 20);
            Graphics g = mutableImg.getGraphics();

            // 2. 設定字體
            Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
            g.setFont(font);

            // 3. 繪製圓角矩形背景(黑)
            g.setColor(0, 0, 0);
            g.fillRoundRect(0, 0, mutableImg.getWidth()-1, mutableImg.getHeight()-1, 20, 20);

            // 4. 繪製白色文字置中
            g.setColor(255, 255, 255);
            int x = (mutableImg.getWidth() / 2) - (font.stringWidth(message) / 2);
            g.drawString(message, x, 0, Graphics.TOP | Graphics.LEFT);
        } catch (Exception e) {
            System.err.println("Error during image creation");
        }
    }

    protected void paint(Graphics g) {
        // 將可變圖像置中繪製到螢幕
        if (mutableImg != null)
            g.drawImage(mutableImg, getWidth()/2, getHeight()/2, Graphics.VCENTER | Graphics.HCENTER);
    }

    public void commandAction(Command c, Displayable d) {
        if (c == cmExit) midlet.exitMIDlet();
    }
}

關鍵技術點

  1. Image.createImage(w, h) 回傳 可變 圖像,內部有一個像素緩衝區。
  2. mutableImg.getGraphics() 取得繪圖上下文,所有 Graphics 操作直接寫入該緩衝區。
  3. 繪製完成後,mutableImg 即成為一張「預渲染」的圖像,後續 paint() 只需 drawImage 極快。
  4. 可變圖像不可用於 Image.createImage(Image src) 複製(會拋出例外),若需副本請手動 getRGB + createRGBImage。

進階應用場景

  • 文字快取:將不常變更的長文字一次繪製到可變圖像,遊戲主迴圈直接貼圖,大幅降低 CPU 佔用。
  • 動態圖示合成:基底圖 + 數字徽章 + 狀態色環 → 合成單一圖像供清單顯示。
  • 雙緩衝:建立兩張可變圖像輪流繪製/顯示,消除閃爍(MIDP 實現多半已內建雙緩衝,但自行控制更靈活)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved