原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/17576995

手游《我叫MT》一开始会弹出一个游戏公告,有玩过的肯定都蛮熟悉的,这就是webview,就是一个网页。由于webview和平台相关,这里就介绍下cocos2d-x如何嵌入andorid的webview控件,在cocos2d-x中显示网页。

1.Jni

Jni这里我就不再多说了。可用参考wikipedia,或者微信飞机大战的移植篇。通过Jni,可以实现在cocos2d-x中调用Android的API,当然也可以进行传值。

2.Android使用webview

直接上代码。主要是处理布局和webview使用的问题。这里采用代码布局。以下操作在android的主类(cocos2dxActivity)中处理

2.1.添加成员变量

整个布局的结构是最底层一个FrameLayout,ImageView控件放置在FrameLayout上。然后之上是一个LinearLayout用来放置关闭按钮,LinearLayout往下是Webview控件。

[cpp] view plaincopy
  1. static Test test  = null;//Test实例
  2. WebView m_webView;//WebView控件
  3. ImageView m_imageView;//ImageView控件
  4. FrameLayout m_webLayout;//FrameLayout布局
  5. LinearLayout m_topLayout;//LinearLayout布局
  6. Button m_backButton;//关闭按钮

2.2.OnCreate中添加FrameLayout布局

[cpp] view plaincopy
  1. protected void onCreate(Bundle savedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. test=this;
  4. //初始化一个空布局
  5. m_webLayout = new FrameLayout(this);
  6. FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(800,640);
  7. lytp .gravity = Gravity.CENTER;
  8. addContentView(m_webLayout, lytp);
  9. }

2.3.返回实例

[cpp] view plaincopy
  1. public static Test getInstance() {
  2. Log.v("TestJacky","getInstance");
  3. return test;
  4. }

2.4.显示webview

[cpp] view plaincopy
  1. public void openWebview() {
  2. Log.v("TestJacky", "openWebView");
  3. this.runOnUiThread(new Runnable() {//在主线程里添加别的控件
  4. public void run() {
  5. //初始化webView
  6. m_webView = new WebView(test);
  7. //设置webView能够执行javascript脚本
  8. m_webView.getSettings().setJavaScriptEnabled(true);
  9. //设置可以支持缩放
  10. m_webView.getSettings().setSupportZoom(true);//设置出现缩放工具
  11. m_webView.getSettings().setBuiltInZoomControls(true);
  12. //载入URL
  13. m_webView.loadUrl("http://m.blog.csdn.net/blog/jackyvincefu/");
  14. //使页面获得焦点
  15. m_webView.requestFocus();
  16. //如果页面中链接,如果希望点击链接继续在当前browser中响应
  17. m_webView.setWebViewClient(new WebViewClient(){
  18. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  19. if(url.indexOf("tel:")<0){
  20. view.loadUrl(url);
  21. }
  22. return true;
  23. }
  24. });
  25. //背景图
  26. m_imageView = new ImageView(test);
  27. m_imageView.setImageResource(R.drawable.bkgnd);
  28. m_imageView.setScaleType(ImageView.ScaleType.FIT_XY);
  29. //初始化线性布局 里面加按钮和webView
  30. m_topLayout = new LinearLayout(test);
  31. m_topLayout.setOrientation(LinearLayout.VERTICAL);
  32. //初始化返回按钮
  33. m_backButton = new Button(test);
  34. m_backButton.setBackgroundResource(R.drawable.btn);
  35. LinearLayout.LayoutParams lypt=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
  36. lypt.gravity=Gravity.RIGHT;
  37. m_backButton.setLayoutParams(lypt);
  38. m_backButton.setOnClickListener(new OnClickListener() {
  39. public void onClick(View v) {
  40. removeWebView();
  41. }
  42. });
  43. //把image加到主布局里
  44. m_webLayout.addView(m_imageView);
  45. //把webView加入到线性布局
  46. m_topLayout.addView(m_backButton);
  47. m_topLayout.addView(m_webView);
  48. //再把线性布局加入到主布局
  49. m_webLayout.addView(m_topLayout);
  50. }
  51. });
  52. }

2.5.移除webview

[cpp] view plaincopy
  1. public void removeWebView() {
  2. m_webLayout.removeView(m_imageView);
  3. m_imageView.destroyDrawingCache();
  4. m_webLayout.removeView(m_topLayout);
  5. m_topLayout.destroyDrawingCache();
  6. m_topLayout.removeView(m_webView);
  7. m_webView.destroy();
  8. m_topLayout.removeView(m_backButton);
  9. m_backButton.destroyDrawingCache();
  10. }

2.6.重写返回键

[cpp] view plaincopy
  1. public boolean onKeyDown(int keyCoder,KeyEvent event)
  2. {
  3. //如果网页能回退则后退,如果不能后退移除WebView
  4. if(m_webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
  5. m_webView.goBack();
  6. }else{
  7. removeWebView();
  8. }
  9. return false;
  10. }

3.cocos2d-x使用Jni

这里直接使用HelloWorld的示例,修改了close按钮的回调函数。

3.1.jni头文件

[cpp] view plaincopy
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  2. #include <jni.h>
  3. #include "platform/android/jni/JniHelper.h"
  4. #endif

3.2.Jni调用打开webview

[cpp] view plaincopy
  1. void HelloWorld::menuCloseCallback(CCObject* pSender)
  2. {
  3. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  4. JniMethodInfo minfo;
  5. //getStaticMethodInfo,判断Java静态函数是否存在,并且把信息保存到minfo里
  6. //参数1:JniMethodInfo
  7. //参数2:Java类包名+类名
  8. //参数3:Java函数名称
  9. //参数4:函数参数类型和返回值类型
  10. bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/jacky/test/Test","getInstance","()Lcom/jacky/test/Test;");
  11. jobject jobj;//存对象
  12. if (isHave) {
  13. //这里的调用getInstance,返回Test类的对象。
  14. jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
  15. isHave = JniHelper::getMethodInfo(minfo,"com/jacky/test/Test","openWebview","()V");
  16. if (isHave) {
  17. //调用openWebview, 参数1:Test对象   参数2:方法ID
  18. minfo.env->CallVoidMethod(jobj, minfo.methodID);
  19. }
  20. }
  21. #else
  22. CCDirector::sharedDirector()->end();
  23. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  24. exit(0);
  25. #endif
  26. #endif
  27. }

4.效果图

爪机截屏的。

ps:这里没有处理多次打开webview的情况。可以采用Jni方法来通知cocos2d-x,也可以直接在主类中设置一个成员变量标志位,调用openWebview时设置为true,removeWebView时设置为false,在调用openWebview时检测这个标志位来决定是否打开即可。

5.源码下载

包含win32,android代码,拿掉了android交叉编译生成的obj,保留so和apk文件。
下载地址:http://download.csdn.net/detail/jackyvincefu/6770315

【玩转cocos2d-x之三十三】游戏嵌入Webview网页相关推荐

  1. 小程序嵌入web-view网页后,点击网页中的按钮跳转回小程序

    1.首先在网页端引入js <script type="text/javascript" src="https://res.wx.qq.com/open/js/jwe ...

  2. SAP UI5 应用开发教程之三十三 - SAP UI5 应用的响应式布局特性(Responsiveness)试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  3. stm8s003程序跑飞_微信小程序只玩跳一跳?OUT啦!带你玩更好玩的微信小游戏!...

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以免费收到最新内容了.每天都有分享,完全是免费订阅,请放心关注.内容来源网络,侵权联系删除. ...

  4. Java黑皮书课后题第3章:*3.17(游戏:剪刀、石头、布)编写可以玩流行的剪刀-石头-布游戏的程序

    *3.17(游戏:剪刀.石头.布)编写可以玩流行的剪刀-石头-布游戏的程序 题目 题目概述 运行示例 ***特别注意*** 破题 代码 题目 题目概述 *3.17(游戏:剪刀.石头.布)编写可以玩流行 ...

  5. 计算机里没有四款小游戏,90后最爱玩的4款“4399”小游戏,一个都没玩过的太可怜!...

    原标题:90后最爱玩的4款"4399"小游戏,一个都没玩过的太可怜! 对于90后的小伙伴们来说,现在的很多东西都属于童年的回忆了,而在我们那个年代,电脑游戏还不是非常的盛行.正式流 ...

  6. 学习编程:能边玩边学的10个游戏编程网站,这样学编程可好玩了

    有很多人说:学习编程是一件非常枯燥无味的事情. 其实,你完全可以换种方法学呀!不想看书?听视频也坚持不下去?那么玩游戏你喜不喜欢呢? 所以,今天就给大家推荐10个可以通过打游戏来学习编程的网站!收藏就 ...

  7. 最齐全的Cocos2D Cocos creator Cocos2Dx游戏源代码素材,速来收藏

    Cocos2D Cocos creator Cocos2Dx游戏源代码类资源应该算是素材类网站中必不可少的资源类型了吧~今天给大家推荐超好用,免费质量高的素材噢,让你坐拥海量资源同时又不撞款! 本人曾 ...

  8. 计算机睡眠状态单机游戏,睡前不玩这款高评分单机游戏的话,一定后悔!

    原标题:睡前不玩这款高评分单机游戏的话,一定后悔! 失眠真的挺讨厌的. 当然手谈姬几乎没有过,高考前夜都睡得跟死猪一样,就连抽到心目中想要的卡也只会乐呵一阵子. 不过倒是经常看到姬友们凌晨1.2点,甚 ...

  9. BetaFlight模块设计之三十三:Pid模块分析

    BetaFlight模块设计之三十三:Pid模块分析 Pid模块 1. Pid_audio子模块 2. Pid_init子模块 3. Pid算法子模块 3.1 TPA模式 3.2 飞行模式 3.3 L ...

最新文章

  1. java spring config_Spring重温(二)--Spring JavaConfig
  2. matplotlib实践过程总结
  3. Java学习第1天:序言,基础及配置tomcat
  4. 干货|Spring Cloud Stream 体系及原理介绍
  5. 操作系统——实验贰——进程通信(一)管道及共享内存
  6. HDU-4310 Hero 贪心Or动态规划
  7. java中选择结构有哪些_Java中的选择结构
  8. Excel VBA简单使用——数据缺失处理
  9. WordPress 中文图片 上传 自动重命名
  10. C++ - 使用copy函数打印容器(container)元素
  11. 《算法导论3rd第十二章》二叉查找树
  12. idm bt种子下载如何提升速度?
  13. 论文笔记:2004-Model Predictive Control of a Mobile Robot Using Linearization
  14. windows10系统hosts文件不见了的解决方法
  15. 倒推法解决“四人玩火柴棍游戏,每一次都是三个人赢,一个人输”问题
  16. MySQL的SQL解析器是干什么的?底层原理是什么?
  17. 欢迎Fork我们的开源云手机项目--OPENVMI(Virtual Mobile Infrastructure)(VMI)
  18. Linux IV ,IVM编辑 退出方法
  19. JavaScript 实现动物识别专家系统交互演示
  20. 【托业】【跨栏】TEST05

热门文章

  1. 测试串行回收与堆初始值有关系01
  2. 内存溢出与内存泄漏区别
  3. python抓取网站访客手机号_点击了一个教育网站,马上就有老师打电话过来,他们是怎么获取我的手机号?...
  4. github上面图片不显示
  5. react跳转url,跳转外链,新页面打开页面
  6. 入门设计模式之建造者模式
  7. SpringMVC之源码分析--HandlerMapping(一)
  8. hihoCoder1353 满减优惠
  9. MQTT协议笔记之mqtt.io项目TCP协议支持
  10. 【转】新浪微博手机客户端刷新都是手动刷新或者下拉刷新,为什么不设计成自动刷新?...