在cocos2dx2.2.6游戏中嵌入Android的WebView,并做屏幕适配

游戏需求参考:cocos2dx游戏嵌入iOS的UIWebView

安卓方面:实现WebView加载,隐藏,显示,移除功能

1.创建WebActivity.java     WebActivity类 继承(extends)   Cocos2dxActivity类

public class WebActivity extends Cocos2dxActivity{

}

2.WebActivity类中设置全局成员变量

static WebActivity  m_webActivity  =  null;     //WebActivity类实例对象

private WebView   m_webView;                     //WebView控件  

private   LinearLayout    m_Layout;                //LinearLayout布局  

public int   m_showType = 0;                         //webView操作类型:0-打开(加载或显示)1-隐藏  2-移除

public String URLS = "http://www.baidu.com";

public boolean isSuccess = false;

public boolean isError = false;

// 此函数提供给jni调用,返回自身类的对象

public static WebActivity getInstance() {// 返回实例

      return   m_ webActivity;

}

3.所有的UI操作,放到同一个 this.runOnUiThread()主线程中

public void dealWebView() {

        this.runOnUiThread(new Runnable() {

            public void run() {

                        if (Show == 1) {

                            hideWebView();

                        } else if (Show == 2) {

                            removeWebView();

                        } else {

                             if (layout != null && m_webView != null) {

                                   showWebView();

                                    // 如果已经加载过,直接显示出来,告诉游戏加载成功

                                   AndroidApi.sayHello(Content.CMD_CTJ_OPEN_SMALL_WEB, "1");

                            }else{

                                    openWebView() ;

                            }

                        }

                } 

        });

 }

// 打开WebView,给WebView一个线性布局

public void openWebView() {

    // 创建并加载

    m_layout = new LinearLayout(SimpleGame.this);

    WebActivity.this.addContentView(m_layout , new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

    m_webView = new WebView(WebActivity.this);

    // 设置webView能够执行javascript脚本

    m_webView.getSettings().setJavaScriptEnabled(true);

    // 使页面获得焦点

    // mWebView.requestFocus();

    // 如果页面中链接,如果希望点击链接继续在当前browser中响应,监听网页加载情况

    m_webView.setWebViewClient(new WebViewClient() {

        public boolean shouldOverrideUrlLoading(WebView view,String url) {

            if (url.indexOf("tel:") < 0) {

                view.loadUrl(url);

            }

            return true;

        }

        @Override // 开始加载

        public void onPageStarted(WebView view, String url,Bitmap favicon) {

            super.onPageStarted(view, url, favicon);

        }

        @Override // 加载完成

        public void onPageFinished(WebView view, String url) {

            super.onPageFinished(view, url);

            if (!isError) {

                isSuccess = true;

                // 回调成功后的相关操作

                showWebView();

                AndroidApi.sayHello(Content.CMD_CTJ_OPEN_SMALL_WEB, "1");

             } else {

                removeWebView();

                AndroidApi.sayHello(Content.CMD_CTJ_OPEN_SMALL_WEB, "0");

            }

            isError = false;

         }

        @Override  // 加载出错

        public void onReceivedError(WebView view,int errorCode, String description,String failingUrl) {

            super.onReceivedError(view, errorCode, description,

            failingUrl);

            isError = true;

            isSuccess = false;

            AndroidApi.sayHello(Content.CMD_CTJ_OPEN_SMALL_WEB, "0");

            removeWebView();

        }

    });

   // 初始化时隐藏webView,防止未加载完成时,显示一个空白的webView; 

   // 但是这句在模拟器上正常显示,在真机上会导致网页显示不出来

   // hideWebView();

    m_layout.addView(m_webView);

    LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams) m_webView.getLayoutParams();

    // 可选的webview位置,X,Y,W,H可任意填写,也可以做为函数参数传入,适配屏幕

    DisplayMetrics metric = new DisplayMetrics();

    getWindowManager().getDefaultDisplay().getMetrics(metric);

    int width = metric.widthPixels; // 屏幕宽度(像素)

    int height = metric.heightPixels; // 屏幕高度(像素)

   // 如果游戏按照横向纵向拉伸适配,则为:

    double HScale = height / 640.0;

    double WScale = width / 1136.0;

    linearParams.leftMargin = (int) (X * WScale);

    linearParams.topMargin = (int) (Y * HScale);

   // linearParams.width = (int) (W * WScale);

   // linearParams.height = (int) (H * HScale);

  linearParams.rightMargin( width  - (int)((X+W) * WScale));

  linearParams.bottomMargin(  height - (int)((Y+H) * HScale ));

   // linearParams.setMargins((int)dis_w, (int)dis_h, (int)dis_w, (int)dis_h);

    m_webView.setLayoutParams(linearParams);

    // 可选的webview配置

    m_webView.setBackground(AndroidApi.mainActivity.getResources().getDrawable(R.drawable.base_dialog_corner_bg));

    m_webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

    m_webView.getSettings().setAppCacheEnabled(false);

    }

}

// 移除webView

public void removeWebView() {

    if (m_layout != null && m_webView != null) {

       m_webView.stopLoading();

       // 清除历史缓存

       // 清除网页访问留下的缓存,针对整个应用程序. 

        m_webView.clearCache(true);

        // 清除当前m_webView访问的历史记录 

        m_webView.clearHistory();

        // 清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据

       m_webView.clearFormData();

        m_webView.destroyDrawingCache();

        m_layout .removeView(m_webView);

        m_webView.destroy();

        m_webView = null;

        m_layout = null;

    }

}

// 隐藏webView

public void hideWebView() {

    if (m_layout != null && m_webView != null) {

        m_layout .setVisibility(View.GONE);

    }

}

//  显示webView

public void showWebView() {

    if (m_layout != null && m_webView != null) {

        m_layout.setVisibility(View.VISIBLE);

    } 

}

java与cococs2dx交互的类中调用:

打开

WebActivity.getInstance().m_showType = 0;

WebActivity.getInstance().dealWebView();

隐藏

WebActivity.getInstance().m_showType =1;

WebActivity.getInstance().dealWebView();

移除

WebActivity.getInstance().m_showType = 2;

WebActivity.getInstance().dealWebView();

你可能感兴趣的:(在cocos2dx2.2.6游戏中嵌入Android的WebView,并做屏幕适配)