簡體   English   中英

按下多個鍵時,Android不調用onKeyUp

[英]Android is not calling onKeyUp when multiple keys pressed

我正在用JavaAndroid編寫一個小游戲,但無法處理輸入。 為了進行早期測試,我使用硬件鍵盤輸入,但最終打算使用游戲手柄控件。

我遇到的問題是:當用戶按住一個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中運行
  • 我的渲染器尚未經過優化,經常跳幀
  • 我正在同時處理觸摸事件
  • 此問題通常在正常游戲過程中顯現。 如果無法解決,則該項目已失效。

問題已解決-錯誤與我最初描述的不完全相同。 我編寫的測試代碼中有一個微妙的錯誤,用於檢測是否失去了焦點,這使我對問題的原因得出了錯誤的結論。

實際上,在觸摸事件過程中,焦點丟失了,有時在keyUp事件觸發時並沒有重新獲得焦點。 多個同時發生的按鍵事件使這種可能性更大,這就是為什么該錯誤地包含在repro中的原因,以及為什么我錯誤地專注於多次按鍵而不是同時發生觸摸事件。

問題的最終原因是無法在我的視圖構造函數中調用setFocusableInTouchMode(true)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM