cocos2dx之WebView踩过的坑(android返回键处理问题)
最近游戏接入了一个私服平台,由于没有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返回键处理问题)的更多相关文章
- quick-cocos2d-x android返回键监听并实现原生退出对话框
这两天最终闲了一下,就顺手又把quick捡起来又学了学,一直都认为quick比cocos2dx那套lua绑定要方便很多,今天试了下android返回键的监听,还是挺好弄的,所以就有了这篇. 首先说明一 ...
- Html5 监听拦截Android返回键方法详解
浏览器窗口有一个history对象,用来保存浏览历史. 如果当前窗口先后访问了三个网址,那么history对象就包括三项,history.length属性等于3. history对象提供了一系列方法, ...
- vue 定义全局函数,监听android返回键事件
vue 定义全局函数,监听android返回键事件 方法一:main.js 注入(1)在main.js中写入函数Vue.prototype.changeData = function (){ aler ...
- android 返回键 操作
cocos2dx项目移植到android平台上对于 android手机返回键,主菜单键等键的相关操作,本篇详细对返回键做个简单的介绍说明, 不足不对之处,请同猿们指出. 首先在主activity下,即 ...
- Cocos3.0 的android返回键功能实现
比如:Game.h Game.cpp 头文件Game.h中定义: void onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent) ...
- Android 返回键的处理
多网友不明确怎样在Android平台上捕获Back键的事件.Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序被切换到后台.而回到桌面的尴尬情况,在Android上有两种方法来获取该 ...
- Coco2d-js/Cocos2d-html5中Android返回键实现
导语: 首先Cocos2d-x其中实现Menu和Back按键相对简单一点,而在资源较少的Cocos2d-html5其中.要实现返回还是有一点不一样的,并且有没有详细的demo.也就仅仅有自己去看api ...
- ionic监听android返回键(实现“再按一次退出”功能)
在android平台上的app,在主页面时经常会遇到"再按一次退出app"的功能,避免只按一下返回键就退出app提升体验优化. 1.这个功能需要我们用到ionic提供的regist ...
- Android返回键
感谢大佬:https://www.cnblogs.com/qiluboy/p/5308310.html Android中back键和home键的区别: back键 Android的程序无需刻意的去退出 ...
随机推荐
- git使用3
如何使用/学习第三方框架? 优秀的第三方框架都在 github.com 1> 搜索 2> git clone 获得完整版本 $ git clone https://github.com/A ...
- GPUImage的filter 响应处理链 的理解笔记
GPUImage的filter的textures处理链式结构 两个最重要的的地方: 最重要的一个类GPUImageOutput(所有的filter的父类,其他也有继承它的,如GPUImageUIEle ...
- map | make_pair
#include <map> void func(std::map<int,std::pair<const char*,int>> &T_map) { st ...
- Spring 4学习——问题与注意事项(一)
1.Spring项目依赖的jar包有5个: 2.applicationContext.xml文件中,如下bean的property的name值对应的是HelloWorld类中的setter方法,即na ...
- java小白进阶安卓第一天
- springmvc 之 返回值
springMVC对于controller处理方法返回值的可选类型 spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, Stri ...
- Tomcat启动报错java.lang.UnsatisfiedLinkError
之前tomcat启动老是报错,虽然不影响项目的启动运行,但是有强迫症的程序员会心里不爽: 问题是由于本机安装的jdk版本与tomcat中使用的jdk版本不一致导致的. 后面我把原先tomcat启动环境 ...
- 重温Android中的消息机制
引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...
- [转]AngularJS 之 ng-options指令
原文地址 一. 基本下拉效果(lable for value in array) 其中select标签中的ng-model属性必须有,其值为选中的对象或属性值. <div ng-controll ...
- v9更换域名
网站在发展的过程中,很可能多次的修改域名.那么在PHPCMS V9中我们要怎么进行设置呢? 请进行以下步骤的修改: 修改/caches/configs/system.php里面所有和域名有关的,把以前 ...