您的位置:首页 > 移动开发 > Cocos引擎

在cocos2dx界面中嵌入android的webview。(c++篇,包含c++和java的交互)

2017-11-07 15:50 501 查看
原创链接: http://blog.csdn.net/a704020443/article/details/78468708

首先,新建一个cocos2dx项目。然后在

proj.android/src/org/cocos2dx/lib/Cocos2dxActivity.java

这个java文件里面开始书写代码。由于我只实现一个打开和关闭webview的功能,所以就直接写在这个java文件里面,不过为了方便,也可以重新建立一个java文件,来写关于这个webview的东西。

首先我们来引入一些包。

import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;


引入DisplayMetrics是为了获取屏幕的宽高。

好了,开始写openWebView。

首先我们来定义一个全局的webview

public WebView m_webView = null;
//--
public static void openWebView(){
sContext.runOnUiThread(new Runnable() {
@Override
public void run() {
//初始化webView
sContext.m_webView = new WebView(sContext);
//设置webView能够执行javascript脚本
sContext.m_webView.getSettings().setJavaScriptEnabled(true);
//设置可以支持缩放
sContext.m_webView.getSettings().setSupportZoom(true);//设置出现缩放工具
sContext.m_webView.getSettings().setBuiltInZoomControls(true);

sContext.m_webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
//载入URL
sContext.m_webView.lo
4000
adUrl("http://www.baidu.com");
//如果页面中链接,如果希望点击链接继续在当前browser中响应
sContext.m_webView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.indexOf("tel:")<0){
view.loadUrl(url);
}
return true;
}
});

DisplayMetrics dm = new DisplayMetrics();
//activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
//在没有Activity上下文时可使用如下方法,需要Context上下文
dm = sContext.getResources().getDisplayMetrics();
int screenwidth = dm.widthPixels;// 宽度
int screenheight = dm.heightPixels;// 高度

ViewGroup.LayoutParams lypt=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
//因为float和int不能转换,所以我这样写方便。别喷!
lypt.width = screenwidth * 8 / 10;
lypt.height = screenheight * 8 / 10;
sContext.m_webView.setX(screenwidth * 1 / 10);
sContext.m_webView.setY(screenheight * 1 / 10);
sContext.m_webView.setLayoutParams(lypt);
sContext.mFrameLayout.addView(sContext.m_webView);
}
});
}


接下来便是closewebview了。

public static void  closeWebView(){
sContext.runOnUiThread(new Runnable() {
@Override
public void run() {
if (sContext.m_webView != null) {
sContext.mFrameLayout.removeView(sContext.m_webView);
sContext.m_webView.destroy();
sContext.m_webView = null;
}
}
});
}


好了。代码已经上传。然后就是由于要在外部调用这两个函数,所以,要在UI线程里面跑。当然,你也可以就在java里面生成两个按钮,来控制打开关闭,这样就不用再UI线程里面跑,去掉下面的代码就可以了。

sContext.runOnUiThread(new Runnable() {
@Override
public void run() {
}
});


然后就是附上java的button的生成和调用用来测试。这样就很不错了。

找到onCreate()函数。把按钮写在这个函数里面。

ViewGroup.LayoutParams lpBtn = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
Button btn = new Button(this);
btn.setLayoutParams(lpBtn);
btn.setText("open WebView");
btn.setOnClickListener(new View.OnClickListener () {
@Override
public void onClick(View view) {
openWebView();
}
});

Button btn_1 = new Button(this);
btn_1.setX(800); //设置它的x坐标位置
btn_1.setLayoutParams(lpBtn);
btn_1.setText("close WebView");
btn_1.setOnClickListener(new View.OnClickListener () {
@Override
public void onClick(View view) {
closeWebView();
}
});
//最后添加到layout中。
mFrameLayout.addView(btn);
mFrameLayout.addView(btn_1);


如果你是在其他java文件中的话,首先你得引用Cocos2dxActivity.java这个文件,其次,把mFrameLayout的属性修改,保护类型改为public不然你无法访问到它。

import org.cocos2dx.lib.Cocos2dxActivity;


好了,我们在java内部已经测试好了,代码没问题,就可以在外部c++中去调用它了。

当然,这两个函数得要是静态的,如果不是静态的,也可以调用,不过稍微有点麻烦而已。

首先生成两个外部的按钮,然后通过点击事件来调用java的函数接口。

//引用
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#endif
//----
btn_1->addClickEventListener([=](Ref*) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

JniMethodInfo t;
//参数:路径(包名)--你需要调用的函数接口--签名
bool ishave = JniHelper::getStaticMethodInfo(t, "org/cocos2dx/lib/Cocos2dxActivity", "openWebView", "()V");
if (ishave) {
t.env->CallStaticVoidMethod(t.classID, t.methodID);
}
#endif

});


首先判断在android下运行。然后通过jni的交互调用你java写的函数接口。如果你重新写的一个java文件,参数就需要变化,还有签名的类型。详细的请问度娘。

好了,写到这里,这个功能就暂时完毕了。

资源下载,包含了webView和安卓的遮罩效果(屏蔽向下的触摸事件)。

链接地址: http://download.csdn.net/download/a704020443/10140876
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: