【问题标题】:Android: Interacting with the screen locks out the buttonsAndroid:与屏幕交互会锁定按钮
【发布时间】:2010-11-21 07:45:13
【问题描述】:

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

我正在编写的应用程序是一个游戏,所以按钮调用是在表面上进行的,然后传递给运行游戏的线程。

我在 HTC Aria 上进行调试,但问题仍然存在于我的模拟器中。

编辑

我拥有的基本代码与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;
     }
    }

【问题讨论】:

  • 你从onKeyDown返回什么?
  • 你阻塞了 UI 线程吗? IE。将控制从事件处理程序传递到游戏代码。你能发布有问题的代码吗?
  • 发布代码..您可能正在阻止 UI 线程,该线程将描述您看到/体验的关键行为
  • 发布了我的按钮代码。我到底需要做什么来防止它阻塞线程?

标签: java android key


【解决方案1】:

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

如果您看到“按键调度超时”之类的信息,那么按钮正在工作,您的代码只是忙,阻止接收任何新输入。

【讨论】:

  • 如果我的代码很忙,我该怎么做呢?任何帮助将不胜感激,我很难过。
  • 如果没有您的“拍摄”和“旋转”方法的代码,我不能肯定地说,但看起来您正在与 UI 线程在同一个线程中运行游戏线程。这是一个禁忌。去研究一些谷歌的例子,比如 LunarLander。
  • 实际上我最初的代码基于 LunarLander 示例,但我遇到了完全相同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
相关资源
最近更新 更多