首先需要添加webview的lua绑定
1、 添加Webview的ini文件。 在frameworks/cocos2d-x/tools/tolua
文件夹中包含导出Lua的配置文件,可以参考cocos2dx_experimental_video.ini
编写生成webview的cocos2dx_experimental_webview.ini,也可以在github上面直接获取cocos2dx_experimental_webview.ini
。
2、运行genbindings.py
脚本。配置编译环境也是一个坑,特别是版本对不上的时候 。
3、添加文件到项目工程。生成的cpp和hpp文件会放到frameworks/cocos2d-bindingsx/cocos/scripting/
下面,在cocos2d_lua_bindings.xcodeproj
中添加这两个文件。
4、在代码中注册。在lua_cocos2dx_ui_manual.cpp
中添加
#include "lua_cocos2dx_experimental_webview_auto.hpp"
,
然后在register_ui_moudle
方法中添加
register_all_cocos2dx_experimental_webview(L);
5、WebView的常用API。
void loadURL(const std::string & url)//载入一个URL
bool canGoBack() //返回是否有一个历史项
//载入给定的HTML的字符串,baseURL为空字符串
void loadHTMLString(const std::string & string,const std::string & baseURL )
goForward
goBack
void reload() //重新载入当前的URL,所以loadURL后用
void setScalesPageToFit(const bool scalesPageToFit)//自动缩放以适应屏幕
create --创建一个webview
6、Lua代码
local webview = cc.WebView:create()
webview:addTo(self.webViewLayer)
webview:setVisible(true)
webview:setScalesPageToFit(true)
webview:loadHTMLString("html的内容","")
webview:setContentSize(size.width,size.height) -- 必要
遇到的坑
1、WebView的背景是白色的期望变成透明。
2、loadHTML不生效,self.uiWebView没有初始化,
UIWebViewImpl-ios.mm
static std::string getFixedBaseUrl(const std::string& baseUrl)
{
std::string fixedBaseUrl;
if (baseUrl.empty() || baseUrl.c_str()[0] != '/') {
fixedBaseUrl = [[[NSBundle mainBundle] resourcePath] UTF8String];
fixedBaseUrl += "/";
fixedBaseUrl += baseUrl;
}
else {
fixedBaseUrl = baseUrl;
}
size_t pos = 0;
while ((pos = fixedBaseUrl.find(" ")) != std::string::npos) {
fixedBaseUrl.replace(pos,1,"%20");
}
if (fixedBaseUrl.c_str()[fixedBaseUrl.length() - 1] != '/') {
fixedBaseUrl += "/";
}
return fixedBaseUrl;
}
- (void)setupWebView {
if (!self.uiWebView) {
self.uiWebView = [[[UIWebView alloc] init] autorelease];
self.uiWebView.delegate = self;
// 2016/10/15 add
**[self.uiWebView setOpaque:NO];
[self.uiWebView setBackgroundColor:[UIColor clearColor]];
}**
if (!self.uiWebView.superview) {
auto view = cocos2d::Director::getInstance()->getOpenGLView();
auto eaglview = (CCEAGLView *) view->getEAGLView();
[eaglview addSubview:self.uiWebView];
}
}
- (void)setScalesPageToFit:(const bool)scalesPageToFit {
if (!self.uiWebView) {[self setupWebView];}//add
self.uiWebView.scalesPageToFit = scalesPageToFit;
}
- (void)loadHTMLString:(const std::string &)string baseURL:(const std::string &)baseURL {
if (!self.uiWebView) {[self setupWebView];} //for fixing no content show
//[self.uiWebView loadHTMLString:@(string.c_str()) baseURL:[NSURL URLWithString:@(baseURL.c_str())]];
[self.uiWebView loadHTMLString:@(string.c_str()) baseURL:[NSURL URLWithString:@(getFixedBaseUrl(baseURL).c_str())]];
}
UIWebViewImpl-android.cpp
static std::string getFixedBaseUrl(const std::string& baseUrl)
{
std::string fixedBaseUrl;
if (baseUrl.empty())
{
fixedBaseUrl = s_defaultBaseUrl;
}
else if (baseUrl.find(s_sdRootBaseUrl) != std::string::npos)
{
fixedBaseUrl = baseUrl;
}
else if (baseUrl.c_str()[0] != '/') {
if(baseUrl.find("assets/") == 0) {
fixedBaseUrl = s_defaultBaseUrl + baseUrl.c_str()[7];
}
else {
fixedBaseUrl = s_defaultBaseUrl + baseUrl;
}
}
else {
fixedBaseUrl = s_sdRootBaseUrl + baseUrl;
}
if (fixedBaseUrl.c_str()[fixedBaseUrl.length() - 1] != '/') {
fixedBaseUrl += "/";
}
return fixedBaseUrl;
}
void loadHTMLStringJNI(const int index,const std::string &string,const std::string &baseURL) {
// LOGD("error: %s,%d",__func__,__LINE__);
cocos2d::JniMethodInfo t;
//if (cocos2d::JniHelper::getStaticMethodInfo(t,CLASS_NAME,"loadHTMLString","(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V")) {
if (cocos2d::JniHelper::getStaticMethodInfo(t,"loadHTMLString","(ILjava/lang/String;Ljava/lang/String;)V")) {
jstring jString = t.env->NewStringUTF(string.c_str());
//change
//jstring jBaseURL = t.env->NewStringUTF(baseURL.c_str());
//t.env->CallStaticVoidMethod(t.classID,t.methodID,index,jString,jBaseURL,nullptr);
jstring jBaseURL = t.env->NewStringUTF(getFixedBaseUrl(baseURL).c_str());
t.env->CallStaticVoidMethod(t.classID,jBaseURL);
t.env->DeleteLocalRef(jString);
t.env->DeleteLocalRef(jBaseURL);
t.env->DeleteLocalRef(t.classID);
}
}
Cocos2dxWebViewHelper.java
@SuppressWarnings("unused")
public static void loadHTMLString(final int index,final String htmlString,final String baseURL) {
cocos2dxActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Cocos2dxWebView webView = webViews.get(index);
if (webView != null) {
webView.loadDataWithBaseURL(baseURL,htmlString,null,null);
}
}
});
}
Cocos2dxWebView.java
public Cocos2dxWebView(Context context,int viewTag) {
this.setBackgroundColor(0); // 设置背景色
//this.getBackground().setAlpha(0); // 设置填充透明度 范围:0-255
参考cocos2dx github #9155/#10909#9118/
背景透明 http://www.thinksaas.cn/topics/0/505/505299.html