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

解決 J2ME 開發中長按鍵/連續按鍵檢測問題

     編輯:J2ME

問題背景

MIDP 低級事件:keyPressed、keyReleased、keyRepeated。並非所有設備支援 keyRepeated,可用 hasRepeatEvents() 檢測。若不支援,需自行實現長按邏輯。

解決方案:標志位 + 獨立繪製線程

核心思路:keyPressed 置位,keyReleased 清位,獨立線程輪詢標志位執行持續動作。

關鍵代碼片段

// 成員變量
private boolean leftPressed, rightPressed;
private int px = getWidth()/2, py = getHeight()/2;
private String btn = "";

// keyPressed
public void keyPressed(int keyCode) {
    int action = getGameAction(keyCode);
    switch(action) {
        case LEFT: left(); leftPressed=true; break;
        case RIGHT: right(); rightPressed=true; break;
    }
    repaint();
}

// keyReleased
public void keyReleased(int keyCode) {
    int action = getGameAction(keyCode);
    switch(action) {
        case LEFT: leftPressed=false; btn=""; break;
        case RIGHT: rightPressed=false; btn=""; break;
    }
    repaint();
}

// 獨立線程 run()
public void run() {
    while(true) {
        if (leftPressed) left();
        if (rightPressed) right();
        try { Thread.sleep(50); } catch(InterruptedException e){}
    }
}

// 移動邏輯
private void left() { if(px>=0) px--; btn="LEFT"; repaint(); }
private void right() { if(px<=getWidth()) px++; btn="RIGHT"; repaint(); }

// paint()
public void paint(Graphics g) {
    g.setColor(0xFFFFFF); g.fillRect(0,0,getWidth(),getHeight());
    g.setColor(0x000000);
    g.drawString(btn, 20,20, Graphics.LEFT|Graphics.TOP);
    g.drawString("J2ME", px, py, Graphics.HCENTER|Graphics.TOP);
}

// keyRepeated(設備支援時調用)
public void keyRepeated(int keyCode) {
    int action = getGameAction(keyCode);
    switch(action) { case LEFT: left(); break; case RIGHT: right(); break; }
    repaint();
}

完整範例:MainCanvas + KeyActionMIDlet

代碼見原文,效果:長按左右鍵,「J2ME」字符串持續平滑移動,頂部顯示當前按鍵狀態。


運行截圖

優勢

  • 不依賴設備 keyRepeated 支援,通用性強。
  • 線程睡眠時間可調(例 50ms),平衡響應速度與 CPU 佔用。
  • 邏輯清晰,易擴展至上下鍵、Fire 鍵等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved