Android 应用中实现 Cocos2dx 游戏的返回键监听

在 Android 中实现返回键的监听,只要两种方式:

  • 方式 1 :监听返回键;

      @Override
      public void onBackPressed() {
     		super.onBackPressed();
      }
    复制代码
  • 方式 2 :重写 keyDown() 方法,监听 KeyEvent 事件 ;

      //重写 keydown 事件
      public boolean onKeyDown(int keyCode, KeyEvent event) {
      if (keyCode == KeyEvent.KEYCODE_BACK) {
         if ((System.currentTimeMillis() - mkeyTime) > 2000) {
                  // 退出操作
              }
          }
      }
    复制代码

但是,在 Android studio 打开 Cocos2dx 游戏的 studio 版本后,无路是方式 1 还是方式 2 都无法监听到返回键的操作。

原因是因为在 Cocos2dx 下的 GLSurfaceView 类中,实现了 keyDown() 方法,导致事件在上层已经被处理掉了。

GLSurfaceView.java
		
@Override
public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {
    switch (pKeyCode) {
        case KeyEvent.KEYCODE_BACK:
         Cocos2dxVideoHelper.mVideoHandler.sendEmptyMessage(Cocos2dxVideoHelper.KeyEventBack);
         ....// 其他省略
        default:
            return super.onKeyDown(pKeyCode, pKeyEvent);
    }
}
复制代码

在官方 API 中关于 keyDown() 的描述是 :

public boolean onKeyDown (int keyCode, KeyEvent event)

Called when a key was pressed down and not handled by any of the views inside of the activity. So, for example, key presses while the cursor is inside a TextView will not trigger the event (unless it is a navigation to another object) because TextView handles its own key presses.

If the focused view didn't want this event, this method is called.

标记部分的文字翻译的意思是:当用户按下一个按键的时候调用,但是前提是这个事件没有被其他的任何 views 监听并处理。

因为在 Cocos2dx 中的 GLSurfaceView 实现了 keyDown() 方法,处理了事件,所以我们的监听事件获取不到事件的返回值。

如何让我们的监听可以获取到事件呢?很简单,只需要在 GLSurfaceView 的 keyDown() 方法中,在监听到KeyEvent.KEYCODE_BACK 时,不作处理即可(return false).

改为如下代码 :

@Override
public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {
    switch (pKeyCode) {
        case KeyEvent.KEYCODE_BACK:
            Cocos2dxVideoHelper.mVideoHandler.sendEmptyMessage(Cocos2dxVideoHelper.KeyEventBack);
            return false;
         ....// 其他省略
        default:
            return super.onKeyDown(pKeyCode, pKeyEvent);
    }
}
复制代码

这样之后,在 Cocos2dx 下的 AppActivity 中就可以监听到返回键了,重写 keyDown() 方法。

private long mkeyTime = 0;
/**
 * 监听Back键按下事件
 * 注意:
 * 返回值表示:是否能完全处理该事件
 * 在此处返回false,所以会继续传播该事件.
 * 在具体项目中此处的返回值视情况而定.
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if ((System.currentTimeMillis() - mkeyTime) > 2000) {
            mkeyTime = System.currentTimeMillis();
            Toast.makeText(this, "再按一次确认退出", Toast.LENGTH_LONG).show();
        } else {
            finish();
        }
        return false;
    } else {
        return super.onKeyDown(keyCode, event);
    }
}
复制代码

就是这样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值