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

原创 2016年12月21日 11:53:05

首先需要添加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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/17576995 手游《我叫MT》一开始会弹出一个游戏公告...

cocos2d-x在iOS/Android双平台上嵌入WebView

注:文章首次发布于个人博客,现将技术文章转移至此。 http://blog.go3k.org/cocos2dx-add-webview/ 游戏中的帮助和游戏公告,可以通过嵌入显示WebVie...

cocos2d3.3不能播放cocostudio导出的粒子动画

cocostudio动画编辑器中加入粒子效果,cocos2d3.3在播放的时候报错:  The value type isn't Type::MAP 在 CCDataReaderHelper...

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

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

cocos2dx webview 打开非http:开头的网页失败

一、在cocos2dx下的src.org.cocos2dx.lib.Cocos2dxWebView.java文件新增 import android.content.Intent import.an...

cocos2dx 3.6 webview背景透明(ios android)

cocos2dx 3.6 webview背景透明(ios android)

cocos2d-x 使用UIWebView加载网页

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=248 前段时间...

cocos2dx IOS 使用UIWebView来加载网页

// // WebViewIOS.h // evilcard // // Created by keltonxian on 6/18/14. // // #ifndef __WEBVIEWIO...

Cocos Creator跨平台的调用方法

原文介绍的是cocos js,因为creator是亲生的,血统一样,而且官方文档这里根本没有介绍,所以参考这个就行了 首先从我们ProjectM的开发背景开始,项目采用的Cocos2d-JS 引擎是为...

cocos2dx之WebView

转自 http://blog.sina.com.cn/s/blog_923fdd9b0102vdd9.html #include "ui/CocosGUI.h" using namespace...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)