unity安卓webview游戏公告

最新,因策划需求,需将游戏中的公告栏改成显示网页,故研究下了android的webview。作为只学过java,没接触过android的我来说。那是相当的痛苦,百度了一会之后,才知道,有webview这东西。
然后各种反复查资料等等,才将webview给弄好,代码如下。需要用的朋友有福了!

最近。看查看这文章的朋友挺多的。然后重新编辑下。提一下几点注意的及Unity里如何调用的问题。

1.首先。如果我们要直接打开网址。用浏览器。而不是在我们游戏里打开的话。那我们无需写安卓。直接Unity的api就搞定了。但是如果要在游戏里显示。那就得用安卓或者ios自己的webview了

2.调用方法。和Unity接入sdk一样。用call的方式去调用安卓里的方法。把游戏和sdk类的东西分离。

3.另外。记得要在原始线程中调用打开webview。接入sdk的时候也尽量用原始线程。防止出问题。

4.完整代码在最下。放入MainActivity中即可。

20141029152554

调用打开webview

 public void OpenWebView(final int w,final int h,final String url) {


     //初始化

  mMain=this;


        //初始化一个空布局
        m_webLayout = new FrameLayout(this);
        FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(w,h);
        lytp .gravity = Gravity.CENTER;
        addContentView(m_webLayout, lytp);

        //初始化


     Log.v("TestJacky", "openWebView");
     this.runOnUiThread(new Runnable() {//在主线程里添加别的控件
            public void run() {
                //初始化webView
                m_webView = new WebView(mMain);
                //设置webView能够执行javascript脚本
                m_webView.getSettings().setJavaScriptEnabled(true);
                //设置可以支持缩放
                m_webView.getSettings().setSupportZoom(true);//设置出现缩放工具
                m_webView.getSettings().setBuiltInZoomControls(true);

                //设置webview透明
                m_webView.setBackgroundColor(0);

                //载入URL
                m_webView.loadUrl(url);
                //使页面获得焦点
                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(mMain);
                //m_imageView.setImageResource(R.drawable.bkgnd);
                m_imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                //初始化线性布局 里面加按钮和webView
                m_topLayout = new LinearLayout(mMain);
                m_topLayout.setOrientation(LinearLayout.VERTICAL);
                //初始化返回按钮
                //m_backButton = new Button(mMain);
                //m_backButton.setBackgroundResource(R.drawable.btn);
                LinearLayout.LayoutParams lypt=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                lypt.gravity=Gravity.RIGHT;
                // m_backButton.setLayoutParams(lypt);


                //把image加到主布局里
                m_webLayout.addView(m_imageView);
                //把webView加入到线性布局
                //m_topLayout.addView(m_backButton);
                m_topLayout.addView(m_webView);
                //再把线性布局加入到主布局
                m_webLayout.addView(m_topLayout);
            }
        });
    }

 

 

关闭webview

   /**
     * 移除公告webview
     * */
    public void removeWebView() {
        m_webLayout.removeView(m_imageView);
        m_imageView.destroyDrawingCache();

        m_webLayout.removeView(m_topLayout);
        m_topLayout.destroyDrawingCache();

        m_topLayout.removeView(m_webView);
        m_webView.destroy();

        //m_topLayout.removeView(m_backButton);
        //m_backButton.destroyDrawingCache();
    }

 

最后完整代码如下

public void OpenWebView(int w,int h,final String url) {
	    	
		mWebWide = w;
		mWebHigh = h;
		mWeburl = "http://www.baidu.com";
		
		handler.sendEmptyMessage(5);
	}
	public void OpenWebViews(int w,int h,final String url)
	{
    	mMain=this;
        
        //初始化一个空布局
        m_webLayout = new FrameLayout(this);
        

        Display mDisplay = getWindowManager().getDefaultDisplay();
        int mW = mDisplay.getWidth();
        int mH = mDisplay.getHeight();

        float mRatio = mH/768.0f;
        
        w = (int)((w - 32) * mRatio);
        h = (int)(h * mRatio);
        
        FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(w,h);
        
        lytp .gravity = Gravity.CENTER;
        addContentView(m_webLayout, lytp);
    	
    	this.runOnUiThread(new Runnable() {//在主线程里添加别的控件
            public void run() {   
                //初始化webView
                m_webView = new WebView(mMain);
                //设置webView能够执行javascript脚本
                m_webView.getSettings().setJavaScriptEnabled(true);            
                //设置可以支持缩放
                m_webView.getSettings().setSupportZoom(true);//设置出现缩放工具
                m_webView.getSettings().setBuiltInZoomControls(true);
                //载入URL
                m_webView.loadUrl(url);
                //使页面获得焦点
                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(mMain);
                //m_imageView.setImageResource(R.drawable.bkgnd);
                m_imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                //初始化线性布局 里面加按钮和webView
                m_topLayout = new LinearLayout(mMain);      
                m_topLayout.setOrientation(LinearLayout.VERTICAL);
                //初始化返回按钮
                //m_backButton = new Button(mMain);
                //m_backButton.setBackgroundResource(R.drawable.btn);
                LinearLayout.LayoutParams lypt=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                lypt.gravity=Gravity.RIGHT;
               // m_backButton.setLayoutParams(lypt);            
                
                
                //把image加到主布局里
                m_webLayout.addView(m_imageView);
                //把webView加入到线性布局
                //m_topLayout.addView(m_backButton);
                m_topLayout.addView(m_webView);                
                //再把线性布局加入到主布局
                m_webLayout.addView(m_topLayout);
            }
        });
    }


	//移除webView
	public void CloseWebView() {    
		
		handler.sendEmptyMessage(6);
	}
	public void CloseWebViews()
	{
		m_webLayout.removeView(m_imageView);
	    m_imageView.destroyDrawingCache();
	    
	    m_webLayout.removeView(m_topLayout);
	    m_topLayout.destroyDrawingCache();
	            
	    m_topLayout.removeView(m_webView);
	    m_webView.destroy();
	            
	    //m_topLayout.removeView(m_backButton);
	    //m_backButton.destroyDrawingCache();
	}

实际调用的为:

OpenWebView

需要原始线程打开。

打开webview后。不能滑动点击解决办法在本文最末尾处。

示例工程展示:

1 2

最后。Unity中调用参考

示例工程下载:链接:http://pan.baidu.com/s/1bnct9W7 密码:5hal (其中包括sdk接入的工程Unity的。文件夹EL下的为我生成好的安卓工程。)

Unity中安卓SDK接入:http://www.bobsong.net/383.html

unity安卓视图获取不到焦点事件:http://www.bobsong.net/614.html

本文链接:

https://bobsong.cn/82.html
1 + 5 =
12 评论
    屌丝
    2014年07月21日 回复

    不错!!! :mrgreen: :idea: :cool:

    chen
    2014年10月29日 回复

    下载地址在哪呢

    飞鸟
    2015年01月19日 回复

    这个 放到unity 中 显示 没问题了 ,但是webview事件响应不了 为什么呢

    飞鸟
    2015年01月19日 回复

    就是说 能响应 unity 的事件 但是不能响应android的事件 比如滑动

      2015年01月19日 回复

      @飞鸟 都可以响应的。如果不能响应。那应该是你什么地方用错了。

    飞鸟
    2015年01月19日 回复

    还有点击,现在放了一个 百度的 url 正常显示 ,但是webview上的所有事件都被屏蔽了 ,这个应该怎么解决呢

    飞鸟
    2015年01月19日 回复

    在线等答案 希望楼主能看到?急急急 啊!

      2015年01月19日 回复

      @飞鸟 这个是要在设备上才能用的。

    飞鸟
    2015年01月19日 回复

    我发布到手机上 ,确实不响应 webview的事件 都不能拖动 。

      2015年01月20日 回复

      @飞鸟 已更新解决办法。请参考博文最后跳转连接。

    飞鸟
    2015年01月19日 回复

    现在 这些代码 如果编译 纯android' 的话 没问题,但是放到unity插件中 就会有我说的问题

    2016年01月11日 回复

    过来瞅瞅!