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 接入的问题

最近项目需要在游戏中做播放网络视屏的功能,发现cocos有自带的WebView,于是就直接从testcpp中把代码搬了进来,如下:、   Size winSize = Director::getIn...
  • xujixian6272002
  • xujixian6272002
  • 2017-03-20 15:46:40
  • 344

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

原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/17576995 手游《我叫MT》一开始会弹出一个游戏公告...
  • liujiayu2
  • liujiayu2
  • 2015-07-21 15:35:08
  • 1556

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

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

cocos中使用Webview

  • 2017年10月12日 09:09
  • 4.77MB
  • 下载

Cocos2d-x界面中嵌套android的webview

在2dx界面中嵌套加载显示一个webview,最简单的用法就是直接在一个WebView控件中显示,代码如下: public class WebViewActivity extends Activity...
  • Nat_myron
  • Nat_myron
  • 2013-12-04 13:46:31
  • 3015

【COCOS2DX-ANDROID-游戏开发之二三】 界面中嵌入Android的WebView

(转载请注明原文地址:http://blog.csdn.net/guggy/article/details/10435157) 在Cocos2dxActivity.java中, (1) 增加...
  • teng_ontheway
  • teng_ontheway
  • 2013-12-11 19:12:11
  • 4218

cocos2dx之WebView

转自 http://blog.sina.com.cn/s/blog_923fdd9b0102vdd9.html #include "ui/CocosGUI.h" using namespace...
  • y505772146
  • y505772146
  • 2015-02-28 10:04:39
  • 2970

在cocos2d-x界面中嵌入Android的WebView

在Cocos2dxActivity.java中, (1) 增加函数onCreateLayout, [java] view plaincopy     public Linea...
  • Kaitiren
  • Kaitiren
  • 2013-09-17 18:46:18
  • 12290

cocos2d-x嵌入webview

  • 2013年12月26日 08:39
  • 4.77MB
  • 下载

Quick-Cocos2d-x 3.3 使用WebView

1、编写ini文件。进入frameworks/cocos2d-x/tools/tolua文件夹,可以根据cocos2dx_experimental_video.ini编写生产cocos2dx_expe...
  • wtuetnsrmh
  • wtuetnsrmh
  • 2015-09-15 17:02:01
  • 2661
收藏助手
不良信息举报
您举报文章:Cocos2d-x3.3 使用WebView以及遇到的问题
举报原因:
原因补充:

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