webview加載js圖形報表


 
    在項目中經常會有一些圖形報表的功能,對於android的圖形報表的實現,可以利用一些開源的android圖形報表框架如: achartengine,hellocharts, MPAndroidChar等,這些框架雖然實現的很好,但在實際項目我們需要的圖形報表是有設計師設計的,可能我們需要效果這些框架沒有提供,或是提供的樣式不符合我們的需求,這時候需要我們去修改這些框架,更改它的樣式,這就要求我們需要熟悉這些框架的源碼,能夠舉一反三的去修改它,然而說起來簡單, 真正改起來並不容易,當然我們也可以自定義view通過繪圖來實現,這種方式是最靈活的,但同樣自己會繪制一個圖形控件也不是能夠簡單的能夠搞定,那么我們改如何能夠快速的實現項目中的這些圖形報表呢,其實,在web網站的開發中也會經常有各種圖形報表的功能,針對這些已經有很多簡單易用,功能豐富多樣的圖形報表框架,那么我們為何不通過webview來調用這些js圖形報表框架呢,
下面介紹下如何通過webview來加載一個個人認為比較好些的圖形報表框架highcharts(不熟悉的人百度搜索highcharts):
 
首先介紹下我要實現的效果:如下圖,要實現一個區域統計圖效果的報表。
 
首先登陸highcharts ( http://www.hcharts.cn/demo/)在線演示平台,通過這平台可以看到highcharts提供了很多效果的圖形報表,找到我們需要效果:曲線區域圖
 
如上圖 提供的效果與我們需要的效果已經很類似,但還是有些差別,別急, 現在去修改它,修改的同時學會它的使用。如圖,點擊編輯代碼。
QQ截圖20150914204139.png
如圖,左側是控制報表效果的js代碼,我們主要是修改這些代碼,這些js代碼的方法屬性我們也許不熟悉,但沒關系,我們可以便嘗試修改預覽可以明白這些屬性是干什么用的。對於類似的圖形報表我們經常關注的有 x軸,y軸坐標標注,數據集等實現,閱讀左側的js代碼我們發現,只有series節點是設置數值數值,我們不妨猜測我們可以通過修改series節點里,data的值達到修改區域圖的y軸對應的值,如圖我注釋調一個數據對象,點擊“運行” 發現 果然只有一條曲線區域圖了,修改同時也發現通過修改data對應的值確實是修改區域圖的關鍵點的值了,其它的屬性也可以通過嘗試學會使用,當然這中方法使用不了解highcharts的人員簡單來學習集成highcharts圖形報表,如果真正學會highcharts還是需要去通過官方API文件去了解每個屬性的用法。
 
好了,我們已經大概了解highcharts的樣子,在實際的項目中,data部分數據肯定是動態,橫坐標的星期也有可能是動態的,那么我們改如何來着做呢
 
html代碼:將左側的data的數據等於成變量,這些變量通過webview接口從android代碼傳遞到js中,
  1. <!doctype html>
    <html lang="en">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <script type="text/javascript" src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script>
      <script type="text/javascript" src="http://cdn.hcharts.cn/highcharts/highcharts.js"></script>
      <script type="text/javascript" src="http://cdn.hcharts.cn/highcharts/exporting.js"></script>
    <script type="text/javascript">
    var result = window.Android.getResult();//調用android中的方法,取得從android傳遞過來的數據
    //alert("result="+result);
    var jsonData = eval("(" + result + ")"); //將json字符串數據轉換為jsonObject對象
    //alert("jsonData="+jsonData);
    var xText = jsonData.xtext;//解析xtext節點數據
    //alert("xText="+xText);
    var data = jsonData.data;
    //alert("data="+data);
    var xdata = jsonData.xdata;
    //alert("xdata="+xdata);
    $(function () {
        $('#container').highcharts({
            chart: {
                type: 'areaspline'
            },
            title: {
                text: '收費統計'
            },
            legend: {
                layout: 'vertical',
                align: 'left',
                verticalAlign: 'top',
                x: 150,
                y: 100,
                floating: true,
                borderWidth: 1,
                backgroundColor: '#FFFFFF'
            },
            xAxis: {
             title: {
                    text: xText
                },
                categories:xdata,
                plotBands: [{ // visualize the weekend
                    from: 4.5,
                    to: 6.5,
                    //color: 'rgba(68, 170, 213, .2)'
                    color: 'rgba(68, 255, 0, 0)'
                }]
            },
            yAxis: {
                title: {
                    text: '收費'
                }
            },
            tooltip: {
                shared: true,
                valueSuffix: ' units'
            },
            credits: {
                enabled: false
            },
            plotOptions: {
                areaspline: {
                    fillOpacity: 0.5
                }
            },
            series: [{
                name: '收費',
                data: data
            }]
        });
    });                    
      </script>
      <style>
        body{margin:0;padding:0;}
      </style>
    </head>
    <body>
      <div id="container" style="width:100%;height:400px"></div>
    </body>
    </html>  

     

將上面的代碼保存到一個html文件中,拷貝放到工程assets目錄下:
 
下面代碼介紹如何通過 webview將參數傳遞給js
java代碼
  1. private void initWebView() {
            activity = this;
            webview.setVisibility(View.VISIBLE);
            WebSettings webSettings = webview.getSettings();
            url = "file:/android_asset/index3.html";
            // 支持JS
            webSettings.setJavaScriptEnabled(true);
            webSettings.setDisplayZoomControls(false); // 隱藏webview縮放按鈕
            webview.addJavascriptInterface(new JsInteration(),
                    "Android");
            webview.setWebChromeClient(new WebChromeClient() {
            });
            // 設置進度條
            webview.setWebChromeClient(new WebChromeClient() {
                public void onProgressChanged(WebView view, int progress) {
                    activity.setTitle("小弟正在努力加載中...");
                    activity.setProgress(progress * 100);
                    if (progress == 100)
                        activity.setTitle(R.string.app_name);
                }
            });
            webview.setWebViewClient(new WebViewClient() {
                public void onReceivedError(WebView view, int errorCode,
                        String description, String failingUrl) { // Handle the error
                }
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url2) {
                    if (Uri.parse(url2).getHost().equals(url)) {
                        // Load the site into the default browser
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri
                                .parse(url));
                        startActivity(intent);
                        return true;
                    }
                    // 1:返回false: Load url into the webview
                    // 2:返回true:已瀏覽器方式
                    return false;
                }
            });
            webview.loadUrl(url);
        }
        private String showtype;
        public class JsInteration {
            @JavascriptInterface
            public String getResult() {
                JSONObject jsonObject = new JSONObject();
                try {
                    JSONArray jsonArray1 = new JSONArray();
                    JSONArray jsonArray2 = new JSONArray();
                    for (int j = 0; j < list2.size(); j++) { //這里的list2是通過接口從服務器取得的數據集合
                        StatisticsChartInfo statisticsChartInfo = list2.get(j);
                        jsonArray1.put(statisticsChartInfo.getCurrtime());
                        jsonArray2.put(Double.valueOf(statisticsChartInfo
                                .getRevenue()));
                    }
                    jsonObject.put("xtext", xtext);
                    jsonObject.put("xdata", jsonArray1);
                    jsonObject.put("data", jsonArray2);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                LogUtil.d("傳遞的數據=" + jsonObject.toString());
                return jsonObject.toString();
            }
        }
        @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
            if (webview!= null) {
                webview.destroy();
            }
        }  
好了,到此為止,我們了解如何通過webview簡單的加載js報表框架,在這里拋磚引玉希望有更多高手指出其中的不足之處,能夠一起討論學習,共同進步。
 

 


免責聲明!

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



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