1. 程式人生 > >在cocos2d-x 2.2.1及android4.3下顯示webview

在cocos2d-x 2.2.1及android4.3下顯示webview

由於文筆有限,寫的不好,大家多見諒,以後堅持寫,提高自己的語言表達溝通能力。
Cocos2dxActivity中新增一個方法:
public LinearLayout onCreateLayout(Cocos2dxGLSurfaceView sufaceView){ LinearLayout layout = new LinearLayout(this); LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); layout.setOrientation(LinearLayout.VERTICAL); layout.setLayoutParams(lp); return layout; }
init()方法中這行程式碼framelayout.addView(this.mGLSurfaceView);下面新增兩行程式碼 LinearLayout contentLayout = this.onCreateLayout(mGLSurfaceView);
framelayout.addView(contentLayout);

然後在src資料夾中的主activity中新增四個變數
public static MyActivity contextInstance;//主activity的靜態例項
private static LinearLayout mContentLayout; private static LinearLayout mWebLayout;

private static WebView mWebView; 
在oncreate方法中新增一句:
contextInstance = this;
然後重寫 
onCreateLayout方法
public LinearLayout onCreateLayout(Cocos2dxGLSurfaceView surfaceView) { mContentLayout = new LinearLayout(this); mContentLayout.setOrientation(LinearLayout.VERTICAL); mWebLayout = new LinearLayout(this); mWebLayout.setOrientation(LinearLayout.VERTICAL); return mContentLayout; }

寫一個靜態方法,彈出網頁

public static void showTanChuTiShi(final float x, final float y, final float width, final float height, final int operateIndex, final String linkUrl, final int showWay) { contextInstance.runOnUiThread(new Runnable() {// 在主執行緒裡新增別的控制元件 public void run() { int screenw = screenWidth; int newx = 0; int newy = 0; newx = (int) (screenw * x / 480.0); newy = (int) (screenw * y / 480.0); int newwidth = (int) (screenw * width / 480.0); int newheight = (int) (screenw * height / 480.0); LinearLayout.LayoutParams lp = new LayoutParams( (int) newwidth, (int) newheight); lp.leftMargin = newx; lp.topMargin = newy; // 初始化webView mWebView = new WebView(contextInstance); mWebView.setBackgroundColor(0); // 設定webView能夠執行javascript指令碼 // mWebView.getSettings().setJavaScriptEnabled(true); // 載入URL WebSettings tishisetting = mWebView.getSettings(); tishisetting.setJavaScriptEnabled(true); tishisetting.setUseWideViewPort(true); tishisetting.setLoadWithOverviewMode(true); // 使頁面獲得焦點 // mWebView.requestFocus(); // 如果頁面中連結,如果希望點選連結繼續在當前browser中響應 mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading( WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // webView.requestFocus(); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // TODO Auto-generated method stub super.onReceivedError(view, errorCode, description, failingUrl); } }); mWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int progress) { } }); mWebView.loadUrl(linkUrl); // 把webView加入到線性佈局 mContentLayout.addView(mWebLayout,lp); LinearLayout.LayoutParams lp0 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); mWebLayout.addView(mWebView, lp0); } }); }
再寫一個關閉網頁的方法
public static void dismisWebView() { contextInstance.runOnUiThread(new Runnable() {// 在主執行緒裡新增別的控制元件 public void run() { if (mWebView != null) { mContentLayout.removeView(mWebLayout); mWebLayout.destroyDrawingCache(); mWebLayout.removeView(mWebView); mWebView.destroy(); } } }); } 寫一個C++的AndroidClassHelper類,在原始檔中新增一個呼叫android主activity中的showTanChuTiShi的方法
void AndroidClassHelper::creatWeblayerInRect(float rx, float ry, float rw, float rh, const char* alertUrl, int vt) { CCLOG("%s%s",__FUNCTION__,alertUrl); //呼叫jni方法 呼叫系統瀏覽器開啟urlStr JniMethodInfo minfo;//定義Jni函式資訊結構體     //getStaticMethodInfo 次函式返回一個bool值表示是否找到此函式     bool isHave = JniHelper::getStaticMethodInfo(minfo,                                                  "com/practice/activity/MyActivity", "showTanChuTiShi","(FFFFILjava/lang/String;I)V");     if (!isHave) {         CCLog(" jni:此函式不存在");     }else{         CCLog("jni:此函式存在");         jstring stringArg1 = minfo.env->NewStringUTF(alertUrl);         //呼叫此函式         minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, rx, ry, rw, rh, at,stringArg1,vt);         minfo.env->DeleteLocalRef(stringArg1);         minfo.env->DeleteLocalRef(minfo.classID);     }     CCLog("jni-java函式執行完畢");     /**      */ } 再在原始檔中新增一個呼叫android主activity中的dismisWebView的方法
void AndroidClassHelper::destoryWeblayer() { CCLog("%s",__FUNCTION__); //呼叫jni方法 呼叫系統瀏覽器開啟urlStr JniMethodInfo minfo;//定義Jni函式資訊結構體     //getStaticMethodInfo 次函式返回一個bool值表示是否找到此函式     bool isHave = JniHelper::getStaticMethodInfo(minfo,                                                   "com/practice/activity/MyActivity", "dismisWebView","()V");     if (!isHave) {         CCLog("dismisWebView jni:此函式不存在");     }else{         CCLog("dismisWebView jni:此函式存在");         //呼叫此函式         minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);         minfo.env->DeleteLocalRef(minfo.classID);     }     CCLog("dismisWebView jni-java函式執行完畢");     /**      */ } 
然後就可以按照自己的需要在C++其他類中呼叫
AndroidClassHelper::creatWeblayerInRect彈出網頁和AndroidClassHelper::destoryWeblayer() 來關閉網頁了 參考文章:http://blog.csdn.net/while0/article/details/10435157