所有渲染座標公式化:x = (screenW - imgW)/2 居中、tilesX = screenW / tileW 地圖循環。混淆器會內聯 final static,零性能損耗。
Font.getHeight()、stringWidth(str) 運行時獲取,支援換行自動排版、軟鍵菜單自適應:
drawSoftKeyMenu(g, left, right, color, style) {
drawString(g, left, 0, canvasH - fontH, ...);
drawString(g, right, canvasW - stringWidth(right), canvasH - fontH, ...);
}
realX = x * scale + offsetX。尺寸按螢幕變量計算;圖片類控件採用**九宮格平鋪**(邊框不拉伸,中間重複),尺寸變化只增減平鋪次數。單類參數化實現所有控件。
// 創建透明子圖 - 統一接口
public static Image createSubImage(Image src, int[] rect) { ... }
// Nokia 實現
Image sub = DirectUtils.createImage(rect[2], rect[3], 0);
sub.getGraphics().drawImage(src, -rect[0], -rect[1], 20);
// MIDP 2.0 實現
return Image.createImage(src, rect[0], rect[1], rect[2], rect[3], 0);
機型專屬實現放入獨立源文件/編譯目標,業務代碼零修改遷移。
位掩碼 int keyStates + 映射函數 convertKey(keyCode)。每機型**只改映射函數**。上層提供 keyDown/keyHold/keyUp 語義,支援運行時按鍵配置。
為每機型維護三套實現(90% 代碼共享),配合**所見即所得動畫/圖集編輯器**產出數據文件。實測:Moto V600 → Nokia N-Gage **1 分鐘完成移植**。
可移植架構本質:**差異點提煉 → 介面隔離 → 實現多態**。最大痛點仍是機型專屬 Bug,需特例處理。寫代碼時請為「移植的兄弟」多留接口、少寫死邏輯。