cocos2dx添加android的webView cocos2d-x在iOS Android添加WebView


iOS平台上的嵌入很順利,網上有現成的教程加代碼,參考如下鏈接中的實現方式:http://www.cocos2dev.com/?p=248

Android平台嵌入 需求:點擊一個按鈕打開Android WebView

1. 通過JNI從cocos2d-x的C++代碼調用java代碼。

這是Android實現WebView嵌入的前提條件,詳細JNI教程:http://www.himigame.com/android-game/725.html

2.Xcode代碼

1.導入頭文件

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)//預編譯 判斷是否是android平台
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include <android/log.h>
#endif

2.在按鈕回調方法代碼

void HelloWorld::openWebView(){    
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    //Jni對象,可以看成結構體
    JniMethodInfo minfo;
    //getStaticMethodInfo,判斷Java靜態函數是否存在,並且把信息保存到minfo里
    //參數1:JniMethodInfo
    //參數2:Java類包名+類名
    //參數3:Java函數名稱
    //參數4:函數參數類型和返回值類型,這里的返回值類型是Majiang類的對象。寫法:L+包名+;     其他的類型請看上面的“JNI詳細教程”
    bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/yourcompany/Majiang/Majiang","getInstance","()Lcom/yourcompany/Majiang/Majiang;");
    jobject jobj;//存對象
    if (isHave) {
        CCLog("靜態函數存在");
        //調用Java靜態函數,取得對象。
        jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
    }
    //getMethodInfo,判斷Java非靜態函數是否存在,並且把信息保存到minfo里
    isHave = JniHelper::getMethodInfo(minfo,"com/yourcompany/Majiang/Majiang","openAndroidView","()V");
    if (isHave) {
        CCLog("非靜態函數存在");
        //調用java非靜態函數, 參數1:Java對象,上面已經取得   參數2:方法ID
        minfo.env->CallVoidMethod(jobj, minfo.methodID);
    }
    #endif
}

3.Java代碼

cocos2d-x的android項目,在eclipse下src目錄里,有一個跟項目名稱相同的類,就在這個類里寫代碼。

這個類初始代碼:

package com.yourcompany.Majiang;
import...
public class Majiang extends Cocos2dxActivity{
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
    }
    static {
         System.loadLibrary("game");
    }
}

添加代碼后:

public class Majiang extends Cocos2dxActivity{
    WebView m_webView;
    ImageView m_imageView;
    static Majiang majiang  = null;
    FrameLayout m_webLayout;
    LinearLayout topLayout;
    Button backButton;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        //全局變量保存this
        majiang=this;
        //初始化一個空的布局
        m_webLayout = new FrameLayout(this);
        addContentView(m_webLayout, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
    }
  //此函數提供給jni調用,返回自身類的對象
    public static Majiang getInstance() {//返回實例
        return majiang;
    }
   public void openAndroidView() {
        this.runOnUiThread(new Runnable() {//在主線程里添加別的控件
            public void run() {   
                //初始化webView
                m_webView = new WebView(majiang);
                //設置webView能夠執行javascript腳本
                m_webView.getSettings().setJavaScriptEnabled(true);            
                //設置可以支持縮放
                m_webView.getSettings().setSupportZoom(true);//設置出現縮放工具
                m_webView.getSettings().setBuiltInZoomControls(true);
                //載入URL
                m_webView.loadUrl("http://www.baidu.com");
                //使頁面獲得焦點
                m_webView.requestFocus();
                //如果頁面中鏈接,如果希望點擊鏈接繼續在當前browser中響應
                m_webView.setWebViewClient(new WebViewClient(){       
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {   
                        if(url.indexOf("tel:")<0){
                            view.loadUrl(url); 
                        }
                        return true;       
                    }    
                });
                /*背景圖*/                
                m_imageView = new ImageView(majiang);
                m_imageView.setImageResource(R.drawable.lobbybg);
                m_imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                /*初始化線性布局 里面加按鈕和webView*/
                topLayout = new LinearLayout(majiang);      
                topLayout.setOrientation(LinearLayout.VERTICAL);
                /*初始化返回按鈕*/
                backButton = new Button(majiang);
                backButton.setBackgroundResource(R.drawable.backbutton);
                backButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
                backButton.setText("關 閉");
                backButton.setTextColor(Color.argb(255, 255, 218, 154));
                backButton.setTextSize(14);                
                backButton.setOnClickListener(new OnClickListener() {                    
                    public void onClick(View v) {
                        removeWebView();
                    }
                });
                //把image加到主布局里
                m_webLayout.addView(m_imageView);
                //把webView加入到線性布局
                topLayout.addView(backButton);
                topLayout.addView(m_webView);                
                //再把線性布局加入到主布局
                m_webLayout.addView(topLayout);
            }
        });
    }
    //移除webView  把剛才加的所有控件都刪掉
    public void removeWebView() {              
        m_webLayout.removeView(m_imageView);
        m_imageView.destroyDrawingCache();
        
        m_webLayout.removeView(topLayout);
        topLayout.destroyDrawingCache();
                
        topLayout.removeView(m_webView);
        m_webView.destroy();
                
        topLayout.removeView(backButton);
        backButton.destroyDrawingCache();
    }
    
    public boolean onKeyDown(int keyCoder,KeyEvent event)//重載函數,android手機實體返回鍵回調函數
    {
         if(m_webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){//如果網頁能回退則后退,如果不能后退移除WebView
             m_webView.goBack();
         }else{
             removeWebView();
         }
         return false;   
    }
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM