[英]Android is not calling onKeyUp when multiple keys pressed
我正在用Java
為Android
編寫一個小游戲,但無法處理輸入。 為了進行早期測試,我使用硬件鍵盤輸入,但最終打算使用游戲手柄控件。
我遇到的問題是:當用戶按住一個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。
可能相關的其他信息:
問題已解決-錯誤與我最初描述的不完全相同。 我編寫的測試代碼中有一個微妙的錯誤,用於檢測是否失去了焦點,這使我對問題的原因得出了錯誤的結論。
實際上,在觸摸事件過程中,焦點丟失了,有時在keyUp事件觸發時並沒有重新獲得焦點。 多個同時發生的按鍵事件使這種可能性更大,這就是為什么該錯誤地包含在repro中的原因,以及為什么我錯誤地專注於多次按鍵而不是同時發生觸摸事件。
問題的最終原因是無法在我的視圖構造函數中調用setFocusableInTouchMode(true)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.