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

J2ME 低層級事件處理機制深度解析:Canvas 按鍵與觸控事件完整指南

     編輯:J2ME

高層 vs 低層事件模型

MIDP 定義兩套事件模型:

  • 高層事件:CommandListener、ItemStateListener,針對 Form/List 等高階組件,語意化命令(確認、返回、選單)
  • 低層事件:繼承 Canvas 覆寫保護方法,直接處理鍵盤按鍵碼、觸控座標、重複觸發,適用於遊戲、自繪組件

Canvas 定義的標準按鍵碼常數

KEY_NUM0  KEY_NUM1  KEY_NUM2  KEY_NUM3  KEY_NUM4
KEY_NUM5  KEY_NUM6  KEY_NUM7  KEY_NUM8  KEY_NUM9
KEY_STAR  KEY_POUND  // * 鍵與 # 鍵

觸控裝置另行支援指標事件。

核心事件處理方法(需覆寫)

方法簽名觸發時機典型用途
keyPressed(int keyCode)按鍵按下瞬間遊戲角色移動啟動、選單確認
keyReleased(int keyCode)按鍵釋放瞬間停止移動、觸發點擊動作
keyRepeated(int keyCode)長按重複觸發(平台相關)持續移動、快速捲動
pointerPressed(int x, int y)觸控/滑鼠按下點擊偵測、拖曳起點
pointerDragged(int x, int y)觸控/滑鼠拖曳移動滑動捲軸、繪圖軌跡
pointerReleased(int x, int y)觸控/滑鼠釋放點擊完成、拖曳結束
showNotify()Canvas 顯示在螢幕上啟動動畫執行緒、恢復音效
hideNotify()Canvas 從螢幕移除暫停動畫、釋放資源、靜音
paint(Graphics g)系統請求重繪核心渲染邏輯(必須實作)

事件處理特性

  • 串行處理:前一事件處理返回前,後續事件不會執行(除非平台文檔另有說明)
  • EDT 執行:所有事件回調運行於事件派發執行緒,嚴禁執行耗時操作(網路、I/O、複雜運算),需委派給背景執行緒
  • repaint() 機制:請求重繪,系統合併多次請求並在稍後呼叫 paint()

完整範例:按鍵碼即時顯示

public class LowLevelMIDlet extends MIDlet {
    protected void startApp() {
        Display.getDisplay(this).setCurrent(new KeyCanvas());
    }
    // pauseApp/destroyApp 省略
}

public class KeyCanvas extends Canvas implements CommandListener {
    private String key = "Press any key";
    
    protected void paint(Graphics g) {
        g.setColor(0xFFFFFF); g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(0x000000);
        g.drawString(key, getWidth()/2, getHeight()/2, Graphics.TOP | Graphics.HCENTER);
    }
    
    public void keyPressed(int keyCode) {
        key = keyCode + " is pressed"; repaint();
    }
    
    public void keyReleased(int keyCode) {
        key = keyCode + " is released"; repaint();
    }
    
    public void commandAction(Command c, Displayable d) { /* 無命令 */ }
}

進階應用指南

遊戲按鍵映射:getGameAction()

int action = getGameAction(keyCode);
// 返回:UP, DOWN, LEFT, RIGHT, FIRE, GAME_A...GAME_D
// 抽象平台差異,建議遊戲邏輯使用 game action 而非原始 keyCode

觸控座標系統

  • 座標原點:Canvas 左上角 (0,0)
  • 單位:像素
  • 多點觸控:MIDP 2.0 標準不支援,需廠商擴展 API(如 Nokia UI API)

效能最佳實踐

  1. keyPressed/Released 僅更新狀態標記,嚴禁直接繪圖或複雜運算
  2. 遊戲主迴圈在獨立執行緒輪詢狀態標記,更新邏輯與渲染
  3. 善用 serviceRepaints() 強制立即重繪(雙緩衝模式下)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved