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

J2ME 開發鍵盤處理指南:keyCode 移植性陷阱與 GameAction 統一抽象方案

     編輯:Java 相關知識

J2ME 低級 UI (Canvas) 直接獲取鍵盤 keyCode,但不同手機廠商、型號的功能鍵 keyCode 差異極大,導致嚴重移植性問題。本文分析鍵盤區域差異、getGameAction() 統一映射機制、Nokia 專用擴展及遊戲開發最佳實踐。

鍵盤兩大區域與移植性現狀

區域包含鍵keyCode 一致性移植性風險
功能鍵區左右軟鍵、導航鍵 (上下左右/確定)、接聽/掛機鍵**極低** (廠商自定義)極高,直接用 keyCode 判斷必失敗
數字鍵區0-9、*、#**高** (ITU-T 標準)低,keyCode 相對固定
高級 UI (Form/List + Command) 僅用功能鍵映射固定 Command,**無移植性問題**,但靈活性受限。

統一抽象方案:Canvas.getGameAction(int keyCode)

將具體 keyCode 映射為標準遊戲動作常量,**屏蔽硬件差異**:

int action = getGameAction(keyCode); // 在 keyPressed/Released/Repeated 中調用

標準映射表 (JSR-118 / MIDP 2.0)

GameAction 常量對應物理鍵 (典型)語義
Canvas.UP數字鍵 2、導航鍵 ↑向上移動
Canvas.DOWN數字鍵 8、導航鍵 ↓向下移動
Canvas.LEFT數字鍵 4、導航鍵 ←向左移動
Canvas.RIGHT數字鍵 6、導航鍵 →向右移動
Canvas.FIRE數字鍵 5、導航鍵確定 (中鍵)確認/射擊/主要動作
Canvas.GAME_A數字鍵 1 或 7輔助動作 A
Canvas.GAME_B數字鍵 3 或 9輔助動作 B
Canvas.GAME_C數字鍵 7 或 *輔助動作 C
Canvas.GAME_D數字鍵 9 或 #輔助動作 D
GAME_A~D 具體映射 1/3/7/9 或 7/9/*/# 取決於手機佈局,**但語義固定為輔助鍵 1~4**,遊戲邏輯只需處理 GAME_A~D 即可跨機型運行。

代碼範例:標準鍵盤處理模板

public class GameCanvas extends Canvas {
    protected void keyPressed(int keyCode) {
        int action = getGameAction(keyCode);
        switch (action) {
            case Canvas.UP:    moveUp();    break;
            case Canvas.DOWN:  moveDown();  break;
            case Canvas.LEFT:  moveLeft();  break;
            case Canvas.RIGHT: moveRight(); break;
            case Canvas.FIRE:  fire();      break;
            case Canvas.GAME_A: specialA(); break;
            case Canvas.GAME_B: specialB(); break;
            case Canvas.GAME_C: specialC(); break;
            case Canvas.GAME_D: specialD(); break;
        }
        repaint();
    }
    // 遊戲邏輯方法...
}

Nokia 專用擴展:com.nokia.mid.ui.FullCanvas

針對 Nokia 系列 (S40/S60 早期機型) 提供軟鍵標準化:

  • FullCanvas.SOFTKEY1 — 左軟鍵
  • FullCanvas.SOFTKEY2 — 右軟鍵
import com.nokia.mid.ui.FullCanvas;

public class NokiaGameCanvas extends FullCanvas {
    protected void keyPressed(int keyCode) {
        if (keyCode == SOFTKEY1) showMenu();
        else if (keyCode == SOFTKEY2) pauseGame();
        else {
            int action = getGameAction(keyCode);
            // 標準遊戲動作處理...
        }
    }
}
僅在 Nokia 設備上可用,發布時需打包 Nokia UI API 庫 (nokia-ui.jar),非 Nokia 設備會 NoClassDefFoundError,建議反射加載或分版本發布。

高級 UI vs 低級 UI 選擇建議

維度高級 UI (Form/List + Command)低級 UI (Canvas + keyCode/GameAction)
移植性極佳 (Command 映射固定)需用 GameAction 保證
靈活性低 (標準佈局)極高 (自定義渲染/邏輯)
適用場景表單、列表、選單、簡單交互遊戲、繪圖、實時動畫、自定義控件
性能一般可優化到極致

總結最佳實踐

  1. 遊戲/實時應用必用 Canvas + getGameAction(),絕不直接判斷 keyCode (除非針對單一機型)。
  2. 方向鍵/確定鍵映射到 UP/DOWN/LEFT/RIGHT/FIRE,輔助鍵映射到 GAME_A~D。
  3. Nokia 設備可選用 FullCanvas.SOFTKEY1/2 處理軟鍵,配合反射實現多版本兼容。
  4. 發布前在主流目標機型 (至少 3-5 款不同廠商) 實機測試鍵盤映射。
  5. 提供鍵位配置界面,允許用戶自定義 keyCode → GameAction 映射 (極少數異形鍵盤)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved