cocos2dx android onkeydown,cocos2dx之WebView踩过的坑(android返回键处理问题)

最近游戏接入了一个私服平台,由于没有sdk,所以支付相关的操作需要在网页端进行,也就是说点击充值需要在游戏内部弹出一个网页,并定位到平台充值的地址。查阅相关资料后决定使用cocos2dx自带的WebView来完成这项任务。WebView的使用方式非常简单,代码如下:

#include "ui/CocosGUI.h"

using namespacecocos2d::experimental::ui;m_WebView =WebView::create(); // m_WebView为成员变量

m_WebView->setPosition(visibleSize / 2);

m_WebView->setContentSize(visibleSize);

m_WebView->loadURL("http://www.baidu.com");

m_WebView->setScalesPageToFit(true);

m_WebView->setOnShouldStartLoading([](WebView *sender, const std::string&url)

{return true;

});

m_WebView->setOnDidFinishLoading([](WebView *sender, const std::string&url)

{

});

m_WebView->setOnDidFailLoading([](WebView *sender, const std::string&url)

{

});this->addChild(m_WebView);

是不是很简单?但是在测试的时候却出现了问题。弹出网页之后,如果点击返回键游戏就会退出,分析之后发现是View处理返回键的默认操作是销毁当前Activity。理想的效果是在弹出WebView之后,如果点击返回键,先判断网页是否可返回,如果可返回就退到上一级网页,如果不可返回(在最初的网页),就关闭WebView,返回游戏。

首先监听游戏内部返回键,并处理返回键逻辑:

boolFirstScene::init()

{//注册捕捉监听

auto listenerkeyPad =EventListenerKeyboard::create();

listenerkeyPad->onKeyReleased = CC_CALLBACK_2(FirstScene::onKeyReleased, this);

_eventDispatcher->addEventListenerWithSceneGraphPriority(listenerkeyPad, this);

}void FirstScene::onKeyReleased(EventKeyboard::KeyCode keycode, cocos2d::Event *event)

{if (keycode ==EventKeyboard::KeyCode::KEY_BACKSPACE)

{if (m_WebView) //如果WebView正在显示

{if (m_WebView->canGoBack()) //判断是否可返回到上一级网页

{

m_WebView->goBack();

}else{

m_WebView->runAction(RemoveSelf::create()); //关闭WebView

m_WebView=nullptr;

}

}else //如果处于游戏主界面

{

Director::getInstance()->popScene(); //结束游戏

}

}

}

接下来让WebView弹出来时点击返回键也执行上述逻辑,这要修改WebView源代码,打开Cocos2dxWebView.java,路径为:src/org/cocos2dx/lib/Cocos2dxWebView.java

public Cocos2dxWebView(Context context, intviewTag) {

super(context);this.mViewTag =viewTag;this.mJSScheme = "";this.setFocusable(true);this.setFocusableInTouchMode(true);this.getSettings().setSupportZoom(false);this.getSettings().setDomStorageEnabled(true);this.getSettings().setJavaScriptEnabled(true);//`searchBoxJavaBridge_` has big security risk.http://jvn.jp/en/jp/JVN53768697

try{

Method method= this.getClass().getMethod("removeJavascriptInterface", new Class[]{String.class});

method.invoke(this, "searchBoxJavaBridge_");

}catch(Exception e) {

Log.d(TAG,"This API level do not support `removeJavascriptInterface`");

}this.setWebViewClient(newCocos2dxWebViewClient());this.setWebChromeClient(newWebChromeClient());this.setOnKeyListener(new OnKeyListener()

{

@Override

public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event)

{

if (keyCode == KeyEvent.KEYCODE_BACK) // 返回键

{

Cocos2dxGLSurfaceView.getInstance().onKeyDown(keyCode, KeyEvent) // 调用游戏主界面的事件监听函数

return true; // 拦截事件,禁止事件向下传递

}

return false; // 其他事件不做处理,继续传递}

});

}

其中Cocos2dxGLSurfaceView就是游戏界面的View,当WebView的返回键事件触发时,直接调用游戏主界面的事件监听函数,并禁止事件向下传递。

原文:http://www.cnblogs.com/zchajax/p/7232914.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值