鍵盤是 J2ME 唯一輸入設備。高級 UI 與低級 UI 處理方式截然不同,跨機型移植的核心痛點在於功能鍵碼不一致。本文系統梳理鍵盤分區、標準映射 API、Nokia 專用擴展與最佳實踐。
| 區域 | 包含鍵 | 跨機型一致性 |
|---|---|---|
| 功能鍵區 | 左/右軟鍵、導航鍵 (上下左右/確定)、接聽/掛機鍵、特殊功能鍵 | **極低** : 數量、位置、KeyCode 全不固定 |
| 數字鍵區 | 0-9、*、# | **高** : 佈局、KeyCode (ASCII) 完全一致 |
Command 映射到軟鍵/菜單。Command.TYPE (OK/BACK/SCREEN/ITEM 等) 和優先級分配到左右軟鍵或菜單。// 錯誤示範
protected void keyPressed(int keyCode) {
if (keyCode == -6) { // 假設某機型左鍵是 -6
// ...
}
}
換機型 KeyCode 變了,代碼失效。
int action = getGameAction(keyCode);
switch (action) {
case Canvas.UP: // 數字鍵 2、導航上
case Canvas.DOWN: // 數字鍵 8、導航下
case Canvas.LEFT: // 數字鍵 4、導航左
case Canvas.RIGHT: // 數字鍵 6、導航右
case Canvas.FIRE: // 數字鍵 5、導航確定
case Canvas.GAME_A: // 數字鍵 1 或 7
case Canvas.GAME_B: // 數字鍵 3 或 9
case Canvas.GAME_C: // 數字鍵 7 或 *
case Canvas.GAME_D: // 數字鍵 9 或 #
}
getGameAction 由設備廠商實現,保證**邏輯動作跨機型一致**。com.nokia.mid.ui.FullCanvas (而非 Canvas)。keyPressed/Released 中判斷 SOFTKEY1 (左軟鍵)、SOFTKEY2 (右軟鍵) 常量。Command 機制,實現軟鍵即時響應 (如遊戲暫停/菜單)。System.getProperty("microedition.platform").indexOf("Nokia") >= 0 動態實例化。public class GameCanvas extends Canvas {
// 跨平台邏輯鍵常量
private static final int LOGIC_UP = 1;
private static final int LOGIC_DOWN = 2;
private static final int LOGIC_LEFT = 3;
private static final int LOGIC_RIGHT = 4;
private static final int LOGIC_FIRE = 5;
private static final int LOGIC_SOFT_LEFT = 6;
private static final int LOGIC_SOFT_RIGHT = 7;
protected void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
int logicKey = mapToLogic(action, keyCode);
handleKeyPress(logicKey);
}
private int mapToLogic(int action, int keyCode) {
switch (action) {
case Canvas.UP: return LOGIC_UP;
case Canvas.DOWN: return LOGIC_DOWN;
case Canvas.LEFT: return LOGIC_LEFT;
case Canvas.RIGHT: return LOGIC_RIGHT;
case Canvas.FIRE: return LOGIC_FIRE;
case Canvas.GAME_A: return LOGIC_SOFT_LEFT; // 常規映射
case Canvas.GAME_B: return LOGIC_SOFT_RIGHT;
default: return 0;
}
}
// Nokia FullCanvas 專用路徑 (運行時動態註冊)
// 見文章 78636 連續按鍵處理模式
}
Command,零移植成本。getGameAction() 映射邏輯動作。FullCanvas + 運行時檢測。