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

#include "ui/CocosGUI.h"
using namespace cocos2d::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,返回游戏。

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

bool FirstScene::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, int viewTag) {
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(new Cocos2dxWebViewClient());
this.setWebChromeClient(new WebChromeClient()); 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的返回键事件触发时,直接调用游戏主界面的事件监听函数,并禁止事件向下传递。

cocos2dx之WebView踩过的坑(android返回键处理问题)的更多相关文章

  1. quick-cocos2d-x android返回键监听并实现原生退出对话框

    这两天最终闲了一下,就顺手又把quick捡起来又学了学,一直都认为quick比cocos2dx那套lua绑定要方便很多,今天试了下android返回键的监听,还是挺好弄的,所以就有了这篇. 首先说明一 ...

  2. Html5 监听拦截Android返回键方法详解

    浏览器窗口有一个history对象,用来保存浏览历史. 如果当前窗口先后访问了三个网址,那么history对象就包括三项,history.length属性等于3. history对象提供了一系列方法, ...

  3. vue 定义全局函数,监听android返回键事件

    vue 定义全局函数,监听android返回键事件 方法一:main.js 注入(1)在main.js中写入函数Vue.prototype.changeData = function (){ aler ...

  4. android 返回键 操作

    cocos2dx项目移植到android平台上对于 android手机返回键,主菜单键等键的相关操作,本篇详细对返回键做个简单的介绍说明, 不足不对之处,请同猿们指出. 首先在主activity下,即 ...

  5. Cocos3.0 的android返回键功能实现

    比如:Game.h   Game.cpp 头文件Game.h中定义: void onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent) ...

  6. Android 返回键的处理

    多网友不明确怎样在Android平台上捕获Back键的事件.Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序被切换到后台.而回到桌面的尴尬情况,在Android上有两种方法来获取该 ...

  7. Coco2d-js/Cocos2d-html5中Android返回键实现

    导语: 首先Cocos2d-x其中实现Menu和Back按键相对简单一点,而在资源较少的Cocos2d-html5其中.要实现返回还是有一点不一样的,并且有没有详细的demo.也就仅仅有自己去看api ...

  8. ionic监听android返回键(实现“再按一次退出”功能)

    在android平台上的app,在主页面时经常会遇到"再按一次退出app"的功能,避免只按一下返回键就退出app提升体验优化. 1.这个功能需要我们用到ionic提供的regist ...

  9. Android返回键

    感谢大佬:https://www.cnblogs.com/qiluboy/p/5308310.html Android中back键和home键的区别: back键 Android的程序无需刻意的去退出 ...

随机推荐

  1. nginx安装文档

    1.   安装依赖包 yum -y install pcre-devel yum -y install openssl-devel yum -y install gcc yum -y install ...

  2. jquery页面水印插件,支持多行水印、行错开

    最近工作需求,需要在页面上加水印,但发现网上示例无法满足我的需求,所以还是自己动手写. 有几个特别需求: 1.可以写多行水印,并且中心对齐. 2.每行水印错开. PS:我找到的例子都是单行水印,所以用 ...

  3. [0] 领域模型 VS 贫血模型

    贫血→结构体领域→封装方法的类 1.领域模型 也要能够 到达解耦,最好不要出现billdao.InsertBill(obj)这种2.领域方法 最好是自身的方法,如改变一个属性值,添加一个子集,而不是一 ...

  4. Python os模块实例之遍历目录及子目录指定扩展名的文件

    需求:在该目录下有很多子目录(如下图,截图了部分),现要从该目录和所有子目录下找到所有扩展名为.meta的文件,并获取文件中第二行guid的值(': '后面的),然后将所有guid的值输出到另一文件中 ...

  5. Masonry 在swift下的使用

    Masonry在oc下使用很方便,但是在swift下,由于oc方法和property都可以使用.fuc的语法,swift下只有属性可以使用.property的语法,方法只能写成.func().因此在s ...

  6. docker - 启动container时出现 [warning] : ipv4 forwarding is disabled. networking will not work

    起因 今天在一台新的centos宿主机上安装docker,由于关闭了iptables,在此之后启动container的时候会出现警告: WARNING: IPv4 forwarding is disa ...

  7. phpstorm显示行号

    在Windows上. 其View->Active Editor->Show Line Numbers (仅适用于当前和变化File->Settings->Editor-> ...

  8. php后台模板html拼接写法

    public function get_kefu_reply_list(){ $wid=$this->_post('order_id'); if(!$wid){ echo('工单信息获取失败!' ...

  9. JQuery事件机制笔记

    一.事件绑定及移除 1.bind() bind()为每个匹配的元素绑定一个或多个事件处理函数: 语法:bind(event,fn)//不能给未来元素添加事件: bind(event,fn); bind ...

  10. 新浪云计算SAE部署代码过程

    第一步:创建本地工作目录: 创建一个新文件夹,可以使用应用名为文件夹名,比如命名为test 第二步:从SAE的SVN仓库检出(checkout)一个应用的全部版本代码,右键–>点击“SVN Ch ...