遊戲啟用全螢幕模式:
public class MyGameCanvas extends Canvas {
public MyGameCanvas() {
setFullScreenMode(true); // 在建構子中呼叫
}
// ...
}
模擬器表現正常,但部署至 Sony Ericsson M608 (UIQ 3 平台) 實機時:螢幕下半部約 1/3 區域空白,遊戲邏輯正常運行,僅繪製區域被壓縮。
Canvas.setFullScreenMode(true) 的行為在 MIDP 2.0 規範中定義為「請求佔用整個螢幕區域」,但具體實現由裝置製造商決定
public class MyGameCanvas extends Canvas {
private boolean fullScreenRequested = false;
protected void paint(Graphics g) {
if (!fullScreenRequested) {
setFullScreenMode(true);
fullScreenRequested = true;
}
// 正常繪製邏輯
}
}
原理:確保 Canvas 已被 Display 顯示,AMS 佈局引擎就緒。
public class GameMidlet extends MIDlet {
private MyGameCanvas canvas;
protected void startApp() {
if (canvas == null) canvas = new MyGameCanvas();
Display.getDisplay(this).setCurrent(canvas);
// 關鍵:在 setCurrent 後、下一個事件迴圈呼叫
new Thread() {
public void run() {
try { Thread.sleep(50); } catch (Exception e) {}
canvas.setFullScreenMode(true);
}
}.start();
}
}
import com.nokia.mid.ui.FullCanvas; // 需 Nokia UI API 庫
public class MyGameCanvas extends FullCanvas {
public MyGameCanvas() {
// FullCanvas 預設全螢幕,無需呼叫 setFullScreenMode
}
}
public static void enableFullScreen(Canvas canvas) {
try {
// 嘗試 Nokia FullCanvas
Class> fcClass = Class.forName("com.nokia.mid.ui.FullCanvas");
if (fcClass.isInstance(canvas)) {
// 已是 FullCanvas 實例,無需處理
return;
}
} catch (ClassNotFoundException ignored) {}
// 標準 MIDP 方式:延遲到 paint 首幀
// 此處可透過繼承 Canvas 並重寫 paint 實現 (方案一)
}
| 裝置/平台 | 建構子中 setFullScreenMode | paint 首幀呼叫 | Nokia FullCanvas | 備註 |
|---|---|---|---|---|
| Nokia S40 (3rd/5th/6th Ed) | ✅ 正常 | ✅ 正常 | ✅ 最佳 | 標準實現良好 |
| Nokia S60 (3rd/5th Ed) | ✅ 正常 | ✅ 正常 | ✅ 最佳 | 支援完整 |
| Sony Ericsson JP-8 (M600i/M608/P1i) | ❌ 下半部空白 | ✅ 正常 | ✅ 正常 | UIQ 3 平台特有 |
| Sony Ericsson K800/W810 (JP-7) | ⚠️ 偶發異常 | ✅ 正常 | ✅ 正常 | 建議用 paint 方式 |
| Motorola RAZR V3/E1000 | ✅ 正常 | ✅ 正常 | ⚠️ 需特定 SDK | 標準較好 |
| Siemens S65/CL75 | ✅ 正常 | ✅ 正常 | ❌ 不支援 | 標準實現 |
| WTK 2.5.2 DefaultColorPhone | ✅ 正常 | ✅ 正常 | ❌ 不支援 | 模擬器行為與真機可能不同 |
paint(Graphics g) 首次執行時呼叫 setFullScreenMode(true),配合 boolean 旗標確保只執行一次com.nokia.mid.ui.FullCanvas,使用反射優雅降級至標準 CanvasJ2ME 「一次編寫,到處運行」在全螢幕模式上折射出規範與實現的張力。setFullScreenMode(true) 看似簡單,實則考驗開發者對 MIDP 生命周期、AMS 行為、廠商差異的深度理解。掌握「延遲初始化」、「反射適配」、「真機驗證」三板斧,是從 J2ME 時代遺留下的寶貴工程直覺,同樣適用於今日 Android 碎片化適配、iOS 安全區域適配、Web 跨瀏覽器兼容。