Java 安卓:与屏幕交互锁定按钮

Java 安卓:与屏幕交互锁定按钮,java,android,key,Java,Android,Key,我的应用程序中同时覆盖了onKeyDown和onMotionEvent。这两种方法都有效,但是onKeyDown的行为很奇怪。我始终可以与设备上的屏幕交互,但在与屏幕交互后,按钮不起作用。为了使它们再次工作,我必须按下其他按钮(我不使用的按钮),以便它们再次工作。如果我再次与屏幕交互,按钮将无法再次工作 我正在编写的应用程序是一个游戏,因此按钮调用被发送到surface,然后传递到运行游戏的线程 我正在HTCAria上调试,但问题仍然存在于我的模拟器中 编辑 我的基本代码与详细代码相同 按钮的代

我的应用程序中同时覆盖了
onKeyDown
onMotionEvent
。这两种方法都有效,但是onKeyDown的行为很奇怪。我始终可以与设备上的屏幕交互,但在与屏幕交互后,按钮不起作用。为了使它们再次工作,我必须按下其他按钮(我不使用的按钮),以便它们再次工作。如果我再次与屏幕交互,按钮将无法再次工作

我正在编写的应用程序是一个游戏,因此按钮调用被发送到surface,然后传递到运行游戏的线程

我正在HTCAria上调试,但问题仍然存在于我的模拟器中

编辑

我的基本代码与详细代码相同

按钮的代码如下所示:

    @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;
     }
    }
@覆盖
公共布尔onKeyDown(int-keyCode,KeyEvent-msg){
返回thread.doKeyDown(keyCode,msg);
}
@凌驾
公共布尔onTouchEvent(运动事件){
返回线程.doTouchEvent(事件);
}
公共布尔doKeyDown(int-keyCode,KeyEvent-msg){
已同步(mSurfaceHolder){
if(keyCode==KeyEvent.keyCode_菜单){
showDialog(对话框ID);
返回true;
}
返回false;
}
}
公共布尔doTouchEvent(运动事件){
已同步(mSurfaceHolder){
如果(mState==状态_播放){
如果(event.getAction()==MotionEvent.ACTION_DOWN | | event.getAction()==MotionEvent.ACTION_MOVE){
if(event.getX()>2*(mWallX/3)){
//射箭
shoot(event.getX(),event.getY());
//轮换球员
旋转(event.getX(),event.getY());
返回true;
}else if(event.getAction()!=MotionEvent.ACTION\u MOVE&&event.getX()<2*(mWallX/3)){
//左侧的temp按钮用于压力测试
压力测试=!压力测试;
返回true;
}
}
}
返回false;
}
}

进入Logcat,观察重新创建问题时出现的消息


如果您看到类似“密钥调度超时”的情况,则按钮正在工作,您的代码很忙,阻止接收任何新的输入。

进入Logcat,查看重新创建问题时出现的消息


如果您看到类似“按键发送超时”的内容,则按钮正在工作,您的代码很忙,阻止接收任何新输入。

onKeyDown返回什么?是否阻止UI线程?即,将控制权从事件处理程序传递给游戏代码。你能发布有问题的代码吗?发布代码..你可能正在阻止UI线程,该线程将描述你正在看到/体验的关键行为发布我的按钮代码。我到底需要做些什么来防止它阻塞线程?从onKeyDown返回什么?是否阻塞UI线程?即,将控制权从事件处理程序传递给游戏代码。你能发布有问题的代码吗?发布代码..你可能正在阻止UI线程,该线程将描述你正在看到/体验的关键行为发布我的按钮代码。我到底需要做些什么来防止它阻塞线程?如果我的代码很忙,我该怎么做才能让它工作呢?如果您能提供任何帮助,我将不胜感激。如果没有“拍摄”和“旋转”方法的代码,我无法确定,但看起来您在与UI线程相同的线程中运行游戏线程。这是一个禁忌。去研究一些谷歌的例子,比如LunarLander。实际上,我最初是根据LunarLander的例子编写代码的,我也遇到了完全相同的问题。如果我的代码很忙,我该怎么做?如果您能提供任何帮助,我将不胜感激。如果没有“拍摄”和“旋转”方法的代码,我无法确定,但看起来您在与UI线程相同的线程中运行游戏线程。这是一个禁忌。去研究一些谷歌的例子,比如LunarLander。实际上,我最初是根据LunarLander的例子编写代码的,我遇到了完全相同的问题。