首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 手機鍵盤處理完全指南:高級/低級 UI 差異、gameAction 映射、Nokia 軟鍵適配

     編輯:J2ME

前言

鍵盤是 J2ME 唯一輸入設備。高級 UI 與低級 UI 處理方式截然不同,跨機型移植的核心痛點在於功能鍵碼不一致。本文系統梳理鍵盤分區、標準映射 API、Nokia 專用擴展與最佳實踐。

鍵盤物理分區

區域包含鍵跨機型一致性
功能鍵區左/右軟鍵、導航鍵 (上下左右/確定)、接聽/掛機鍵、特殊功能鍵**極低** : 數量、位置、KeyCode 全不固定
數字鍵區0-9、*、#**高** : 佈局、KeyCode (ASCII) 完全一致

高級 UI (Screen/Form) 鍵盤處理

  • 僅通過 Command 映射到軟鍵/菜單。
  • 系統自動根據 Command.TYPE (OK/BACK/SCREEN/ITEM 等) 和優先級分配到左右軟鍵或菜單。
  • **開發者無需處理 KeyCode**,完全屏蔽硬件差異,移植性最好。

低級 UI (Canvas/GameCanvas) 鍵盤處理

直接用 KeyCode = 移植災難

// 錯誤示範
protected void keyPressed(int keyCode) {
    if (keyCode == -6) { // 假設某機型左鍵是 -6
        // ...
    }
}

換機型 KeyCode 變了,代碼失效。

標準解法:getGameAction(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 由設備廠商實現,保證**邏輯動作跨機型一致**。
  • 數字鍵區映射固定 (2/8/4/6/5),功能鍵區由廠商映射導航鍵到對應動作。

Nokia 專用擴展:FullCanvas 軟鍵直接捕獲

  • 繼承 com.nokia.mid.ui.FullCanvas (而非 Canvas)。
  • 直接在 keyPressed/Released 中判斷 SOFTKEY1 (左軟鍵)、SOFTKEY2 (右軟鍵) 常量。
  • 優點:繞過 Command 機制,實現軟鍵即時響應 (如遊戲暫停/菜單)。
  • 缺點:僅限 Nokia 設備,需運行時判斷 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 連續按鍵處理模式
}

總結

  1. 高級 UI 用 Command,零移植成本。
  2. 低級 UI **禁用硬編碼 KeyCode**,強制用 getGameAction() 映射邏輯動作。
  3. 需軟鍵即時響應時,Nokia 機型可選 FullCanvas + 運行時檢測。
  4. 建立內部邏輯鍵常量層,業務代碼只依賴邏輯鍵,徹底隔離硬件差異。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved