我正在爲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運行
- 我的渲染器還沒有調整到最佳,經常會跳幀
- 我正在同時處理觸摸事件
- 此問題在正常遊戲中經常出現。如果這不能解決,該項目已經死亡。
你能詳細說明這些方法的定義嗎?在活動或視圖中?你嘗試過什麼API級別? –
@DougStevenson這些方法在我的視圖中定義 - 目前在應用程序中唯一的視圖,它似乎並沒有失去焦點。 我正在使用API級別22.我還沒有嘗試過其他級別 - 您認爲這可能會解決問題嗎? –
我真的不知道,也許有不同的API級別修復了不同的行爲。 –