在 J2ME 中實現淡入淡出效果,主要有三種方法:
PNG 圖片若為索引色模式,包含調色板(PLTE chunk),記錄每個索引對應的 RGB 值。修改調色板中的 RGB 值即可改變圖片整體色調,進而實現淡入(調色板漸變為白色)或淡出(調色板漸變為黑色)。
public class PngFadeInOut extends MIDlet {
GameCanvas canvas;
Display display;
public PngFadeInOut() {
super();
try {
display = Display.getDisplay(this);
canvas = new GameCanvas(this);
} catch (Exception e) {}
}
protected void startApp() {
if (canvas != null) {
display.setCurrent(canvas);
canvas.start();
}
}
// pauseApp, destroyApp 略
}
class GameCanvas extends Canvas {
static String imageName = "/fadeInOut.png";
static final int MAX_TARDINESS = 30;
// 狀態與計時器相關欄位略...
byte[] oldRGBData = null; // 原始調色板 RGB 資料
byte[] imgData = null; // 圖片完整二進位資料
static final int FADE_IN = 0;
static final int FADE_OUT = 1;
static int fadeType = FADE_IN;
void gameInit() {
scrW = getWidth(); scrH = getHeight();
offImage = Image.createImage(scrW, scrH);
g = offImage.getGraphics();
changeGameMode(gmStart);
}
void gameMain() {
if (gameMode == gmStart && subMode == smInit) {
// 1. 讀取圖片二進位資料
imgData = loadFile(imageName);
// 2. 擷取並備份調色板 RGB 資料
oldRGBData = getPlteRGBData(imgData);
if (fadeType == FADE_IN) {
// 3. 將調色板設為白色 (255,255,255) 以實現淡入
for (int i = rgbDataStartPos; i < rgbDataStartPos + rgbDataLength; i++) {
imgData[i] = (byte) 255;
}
}
}
}
// 繪製、計時器、檔案讀取等輔助方法略...
}
getResourceAsStream 讀取 PNG 檔案至位元組陣列。Image.createImage(imgData, 0, imgData.length) 從修改後的資料建立圖片並繪製。Timer 定期更新調色板並重繪。修改調色板資料是 J2ME 實現淡入淡出的高效方案,特別適合資源受限的行動裝置。開發者可根據專案需求,選擇此法或搭配其他技巧達成最佳視覺效果。