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

原创链接: 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.loadUrl("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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值