2010-11-21 145 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