MIDP 中 Image 分兩種:
Image.createImage("/file.png")、createImage(InputStream) 產生,唯讀,可跨執行緒安全共享。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();
}
}
Image.createImage(w, h) 回傳 可變 圖像,內部有一個像素緩衝區。mutableImg.getGraphics() 取得繪圖上下文,所有 Graphics 操作直接寫入該緩衝區。mutableImg 即成為一張「預渲染」的圖像,後續 paint() 只需 drawImage 極快。Image.createImage(Image src) 複製(會拋出例外),若需副本請手動 getRGB + createRGBImage。