在 J2ME 遊戲或自訂 UI 開發中,繼承 Canvas 類是常見做法。然而,調用 setFullScreenMode(true) 時,不同手機型號對 sizeChange() 回調的處理差異極大,極易導致顯示異常甚至程式崩潰。本文分享實戰經驗,幫助開發者避開這個經典陷阱。
當進入全螢幕模式時,系統可能會觸發 sizeChange(int w, int h) 方法,並傳入實際可用的寬高。但各廠商實現不一:
sizeChange(),傳入真實螢幕尺寸。sizeChange(),需直接在初始化時呼叫 getWidth()、getHeight() 獲取尺寸。sizeChange() 中初始化繪圖資源,而在非回調機型上該方法永不被調用,導致資源未初始化、繪圖錯位。sizeChange() 內部拋出未捕獲異常,系統在初始化階段即會終止 MIDlet,造成程式直接崩潰。protected void sizeChanged(int w, int h) {
// 統一在此處理尺寸變更邏輯
canvasWidth = w;
canvasHeight = h;
initResources();
}
public void init() {
// 對於不觸發 sizeChange 的機型,主動調用
if (canvasWidth == 0) {
sizeChanged(getWidth(), getHeight());
}
}
在 sizeChange() 及所有初始化邏輯中添加 try-catch,避免單點錯誤導致整體崩潰。
務必在主流機型(Nokia、Sony Ericsson、Motorola、Siemens 等)實機測試,驗證全螢幕切換與尺寸獲取的正確性。
理解 sizeChange() 的跨平台行為差異,採用統一初始化入口與異常防護,是開發穩健 J2ME 圖形應用的關鍵。希望本文能助你少走彎路。