2016-03-04 65 views
2

我正在爲Java編程一個小遊戲Android,而且我在處理輸入時遇到問題。對於早期測試,我使用硬件鍵盤輸入,但我打算最終使用遊戲手柄控件。當多個按鍵按下時,Android不會調用onKeyUp

我遇到的問題是:當用戶持有一個key約10秒以上,並同時按下並釋放其他許多按鍵時,該第一個按鍵的onKeyUp()函數不會被調用最終被釋放。

我還沒有找到一個完全最小的repro,但我可以在兩個不同的emulators和一個物理Nexus 5(帶有一個將其本身顯示爲鍵盤的遊戲手柄)上可靠地觸發。

相關的代碼,有冗餘和日誌報表中刪除:

public class GameSurfaceView extends GLSurfaceView { 
    public final static short VBTN_FORWARD  = 0; 
    public final static short VBTN_BACKWARD  = 1; 
    // snipped several more similar constants 
     public AtomicIntegerArray virtual_button_state = new AtomicIntegerArray(7); 

    @Override 
    public boolean onKeyDown(int keyCode, @NonNull KeyEvent event){ 
     if (event.isLongPress() || event.getRepeatCount() > 0){ 
      return true; 
     } 
     switch (keyCode) { 
      case KeyEvent.KEYCODE_DPAD_UP: 
      case KeyEvent.KEYCODE_W: 
       virtual_button_state.incrementAndGet(GameRenderer.VBTN_FORWARD); 
       return true; 
      case KeyEvent.KEYCODE_DPAD_DOWN: 
      case KeyEvent.KEYCODE_S: 
       virtual_button_state.incrementAndGet(GameRenderer.VBTN_BACKWARD); 
       return true; 
      // snipped several more similar cases 
     } 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, @NonNull KeyEvent event){ 
     switch (keyCode) { 
      case KeyEvent.KEYCODE_DPAD_UP: 
      case KeyEvent.KEYCODE_W: 
       virtual_button_state.decrementAndGet(GameRenderer.VBTN_FORWARD); 
       return true; 
      case KeyEvent.KEYCODE_DPAD_DOWN: 
      case KeyEvent.KEYCODE_S: 
       virtual_button_state.decrementAndGet(GameRenderer.VBTN_BACKWARD); 
       return true; 
      // snipped several more similar cases 
     } 
    } 
} 

我已經做了廣泛的測試,並跟蹤語句表明的onkeyup()不會被調用所有。無論問題是什麼,它都會阻止事件首先到達我的GLSurfaceView。

可能相關的其他信息:

  • 我的活動是全屏的,沒有標題
  • 我的渲​​染器在RENDERMODE_CONTINUOUSLY運行
  • 我的渲​​染器還沒有調整到最佳,經常會跳幀
  • 我正在同時處理觸摸事件
  • 此問題在正常遊戲中經常出現。如果這不能解決,該項目已經死亡。
+0

你能詳細說明這些方法的定義嗎?在活動或視圖中?你嘗試過什麼API級別? –

+0

@DougStevenson這些方法在我的視圖中定義 - 目前在應用程序中唯一的視圖,它似乎並沒有失去焦點。 我正在使用API​​級別22.我還沒有嘗試過其他級別 - 您認爲這可能會解決問題嗎? –

+0

我真的不知道,也許有不同的API級別修復了不同的行爲。 –

回答

0

問題已解決 - 錯誤不像我最初描述的那樣。我寫的測試代碼中有一個微妙的錯誤,用於檢測焦點是否丟失,這導致我對問題的原因得出錯誤的結論。

在觸摸事件期間,焦點實際上正在丟失,有時並未在keyUp事件觸發時恢復。多個同時發生的關鍵事件使得這種情況更加可能,這就是爲什麼它被錯誤地包含在repro中,以及爲什麼我錯誤地關注多個按鍵而不是同時觸摸事件。

問題的根本原因是未能在我的視圖構造函數中調用setFocusableInTouchMode(true)。