Cocos2d-x3.3 使用WebView以及遇到的问题

首先需要添加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, CLASS_NAME, "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, t.methodID, index, jString, 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, 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

你可能感兴趣的:(quick-cocos2dx)