2010-11-21 105 views
1

我在應用程序中重寫了onKeyDownonMotionEvent。這兩個工作,但onKeyDown有奇怪的行爲。我總是可以與設備上的屏幕進行交互,但在與屏幕交互後,按鈕不起作用。爲了讓他們再次工作,我必須推動其他按鈕(我不使用的按鈕),以便他們再次工作。如果我再次與屏幕交互,這些按鈕將不會再工作。Android:與屏幕交互鎖定按鈕

我正在編寫的應用程序是一個遊戲,所以按鈕調用是對錶面進行的,然後傳遞給運行遊戲的線程。

我在HTC Aria上調試,但問題仍然存在於我的模擬器中。

EDIT

基本代碼我有相同是詳細here

代碼的按鈕如下:

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent msg) { 
    return thread.doKeyDown(keyCode, msg); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    return thread.doTouchEvent(event); 
    } 


    public boolean doKeyDown(int keyCode, KeyEvent msg) { 
    synchronized (mSurfaceHolder) { 
     if (keyCode == KeyEvent.KEYCODE_MENU) { 
     showDialog(DIALOG_PAUSED_ID); 
          return true; 
     } 
     return false; 
    } 
    } 

    public boolean doTouchEvent(MotionEvent event) { 
    synchronized (mSurfaceHolder) { 
     if (mState == STATE_PLAYING) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE){ 
       if (event.getX() > 2 * (mWallX/3)) { 

       //shoot arrow 
       shoot(event.getX(), event.getY()); 

       //turn player 
       mPlayer.rotate(event.getX(), event.getY()); 

      return true; 
     } else if (event.getAction() != MotionEvent.ACTION_MOVE && event.getX() < 2 * (mWallX/3)) { 
     //temp button on left for stress test 
       stressTest = !stressTest; 
       return true; 
     } 
     } 
     } 
    return false; 
    } 
    } 
+0

你從onKeyDown返回什麼? – 2010-11-21 07:47:42

+1

你是否阻止UI線程?即將控制從事件處理程序傳遞給遊戲代碼。你能發佈有問題的代碼嗎? – 2010-11-21 09:08:00

+0

後期代碼..你可能會阻止UI線程,這將描述你所看到/體驗的關鍵行爲 – 2010-11-21 13:19:57

回答

1

走進logcat的,看出現的消息,當您重新創建您的問題。

如果您看到類似「密鑰調度超時」的事情,那麼按鈕正在工作,您的代碼只是繁忙,阻止任何新的輸入被接收。

+0

如果我的代碼很忙,我該如何去做這項工作?任何幫助將不勝感激,我很難過。 – 2010-11-24 03:16:20

+0

我不能確定沒有代碼給你的「射擊」和「旋轉」方法,但它看起來像是在與UI線程相同的線程中運行遊戲線程。這是一個禁忌。去研究一些谷歌的例子,比如LunarLander。 – user432209 2010-11-24 20:45:10

+0

我實際上最初基於LunarLander示例中的代碼,並且我遇到了完全相同的問題。 – 2010-11-25 04:27:01