原创作品,转载请标明:http://www.52php.cn/article/p-ybpkbbax-ep.html
手游《我叫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控件。
- staticTesttest=null;
- WebViewm_webView;
- ImageViewm_imageView;
- FrameLayoutm_webLayout;
- LinearLayoutm_topLayout;
- Buttonm_backButton;
2.2.OnCreate中添加FrameLayout布局
protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- test=this;
-
-
- m_webLayout=newFrameLayout(this);
- FrameLayout.LayoutParamslytp=newFrameLayout.LayoutParams(800,640);
- lytp.gravity=Gravity.CENTER;
- addContentView(m_webLayout,lytp);
- }
2.3.返回实例
publicstaticTestgetInstance(){
- Log.v("TestJacky","getInstance");
- returntest;
- }
2.4.显示webview
voidopenWebview(){
- "openWebView");
- this.runOnUiThread(newRunnable(){
- voidrun(){
- //初始化webView
- m_webView=newWebView(test);
- //设置webView能够执行javascript脚本
- m_webView.getSettings().setJavaScriptEnabled(true);
- //设置可以支持缩放
- m_webView.getSettings().setSupportZoom(true);
- m_webView.getSettings().setBuiltInZoomControls(true);
-
- m_webView.loadUrl("http://m.blog.csdn.net/blog/jackyvincefu/");
- //使页面获得焦点
- m_webView.requestFocus();
- //如果页面中链接,如果希望点击链接继续在当前browser中响应
- m_webView.setWebViewClient(newWebViewClient(){
- publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
- if(url.indexOf("tel:")<0){
- view.loadUrl(url);
- }
- returntrue;
- });
-
- //背景图
- m_imageView=newImageView(test);
- m_imageView.setImageResource(R.drawable.bkgnd);
- m_imageView.setScaleType(ImageView.ScaleType.FIT_XY);
- //初始化线性布局里面加按钮和webView
- m_topLayout=newLinearLayout(test);
- m_topLayout.setOrientation(LinearLayout.VERTICAL);
- //初始化返回按钮
- m_backButton=newButton(test);
- m_backButton.setBackgroundResource(R.drawable.btn);
- LinearLayout.LayoutParamslypt=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
- lypt.gravity=Gravity.RIGHT;
- m_backButton.setLayoutParams(lypt);
- m_backButton.setOnClickListener(newOnClickListener(){
- voidonClick(Viewv){
- removeWebView();
- }
- });
- //把image加到主布局里
- m_webLayout.addView(m_imageView);
- //把webView加入到线性布局
- m_topLayout.addView(m_backButton);
- m_topLayout.addView(m_webView);
- //再把线性布局加入到主布局
- m_webLayout.addView(m_topLayout);
- }
2.5.移除webview
voidremoveWebView(){
- m_webLayout.removeView(m_imageView);
- m_imageView.destroyDrawingCache();
- m_webLayout.removeView(m_topLayout);
- m_topLayout.destroyDrawingCache();
- m_topLayout.removeView(m_webView);
- m_webView.destroy();
- m_topLayout.removeView(m_backButton);
- m_backButton.destroyDrawingCache();
- }
2.6.重写返回键
publicbooleanonKeyDown(intkeyCoder,KeyEventevent)
- {
- //如果网页能回退则后退,如果不能后退移除WebView
- if(m_webView.canGoBack()&&keyCoder==KeyEvent.KEYCODE_BACK){
- m_webView.goBack();
- }else{
- false;
- }
3.cocos2d-x使用Jni
这里直接使用HelloWorld的示例,修改了close按钮的回调函数。
3.1.jni头文件
#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
- #include<jni.h>
- #include"platform/android/jni/JniHelper.h"
- #endif
3.2.Jni调用打开webview
voidHelloWorld::menuCloseCallback(CCObject*pSender)
- JniMethodInfominfo;
- //getStaticMethodInfo,判断Java静态函数是否存在,并且把信息保存到minfo里
- //参数1:JniMethodInfo
- //参数2:Java类包名+类名
- //参数3:Java函数名称
- //参数4:函数参数类型和返回值类型
- boolisHave=JniHelper::getStaticMethodInfo(minfo,"com/jacky/test/Test","getInstance","()Lcom/jacky/test/Test;");
- jobjectjobj;
- if(isHave){
- //这里的调用getInstance,返回Test类的对象。
- jobj=minfo.env->CallStaticObjectMethod(minfo.classID,minfo.methodID);
- isHave=JniHelper::getMethodInfo(minfo,"com/jacky/test/Test","openWebview","()V");
- if(isHave){
- //调用openWebview,参数1:Test对象参数2:方法ID
- minfo.env->CallVoidMethod(jobj,minfo.methodID);
- #else
- CCDirector::sharedDirector()->end();
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)
- exit(0);
- #endif
- #endif
- }
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 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|