1. 程式人生 > >百度ECharts---android線上展示統計圖表(折線圖\柱狀圖\餅狀圖)

百度ECharts---android線上展示統計圖表(折線圖\柱狀圖\餅狀圖)

做金融型別的應用經常會用到資料的統計報表 諸如折線圖 ,  K線圖, 餅狀圖,柱狀圖  既能形象的表述資料的分佈 , 同時又增加了資料的可讀性

實現思路: 百度Echarts支援安卓移動端的運用 , WebView載入html, 巢狀JavaScript程式碼 , 即可動態實現線上圖表的展示功能..

下面展示下今天要實現的效果




進入Echarts官網下載頁 可以選擇自己需要的圖表型別 自定義下載js檔案 , 精簡版,常用版, 完整版 根據需求自定義下載

  • 匯入剛下載的圖表構建工具   echarts.min.js  到安卓專案的 資產目錄(assets)下 這裡我使用的 完整版
  • 建立 Htm l檔案 , 即要展示的網頁 ,  檔名自定義 這裡我是 myechart.html
  • 我的assets目錄結構如下:

  • 接下來就是html檔案的程式碼了 首先我們為ECharts準備一個具備大小(寬高) 的 DOM 並取別名
    <div id="main" style="float: left; width: 600px;height:500px; margin-top: 20px"></div>
  • 匯入圖表構建工具
    <script src="js/echarts.min.js"></script>
  • 因為我這裡要展示多種型別的圖表 所以定義了幾個方法  下面以折線圖為例
  • var lineJson;//用於臨時儲存折線圖json物件, 便於追加資料
    //建立折線圖
     function createLineChart(obj){
         lineJson=obj;
         options = {
             title : {
                     //text: '脈搏值(次/min)',
                     text: obj.title,
                     subtext: 'make by sxt',
                     x:'left'
                   },
             tooltip: {
                    trigger: 'axis',
                    formatter: "脈搏頻率 : <br/>{b} - {c} 次/min"
               },
             xAxis: {
                    id: 'dataX',
                    type: 'category',
                    splitLine:{
                       show:true
                    },
                   axisLabel: {
                       //formatter: '{value} °C'
                       formatter: '{value}'
                   },
                   data: obj.times //動態展示運動時間
               },
             yAxis: {
                   type: 'value',
                   axisLine: {onZero: true},
                   splitLine:{
                       show:true
                   },
                   axisLabel: {
                       //formatter: '{value} km'
                       formatter: '{value}'
                   },
                   min:0,
                   max:150//在此設定範圍
               },
    
             dataZoom: [
                  {
                     id:'dataZoom',
                     show:false,
                     type: 'inside',//inside 為拖動效果
                     //type: 'slider',//slider為手動更新效果
                     realtime: true,
                     filterMode: 'filter',
                     start: 20,
                     end: 85,
                     xAxisIndex: 0
                 }
               ],
    
             series: [{
               id: 'dataY',
               name: '脈搏頻率(次)/(s)',
               type: 'line',
               smooth: true,
               data: obj.steps, //動態展示運動步數資料
               lineStyle: {
                  normal: {
                       width: 3,
                       shadowColor: 'rgba(0,0,0,0.4)',
                       shadowBlur: 10,
                       shadowOffsetY: 10
                   }
               },
               markPoint : {//標註點
                            data : [//這種方式內部自動計算最值
                               {
                                 type :'max'  ,
                                 name:'最大值' ,
                                 symbol:'image://' + treeUrl,
                                 symbolSize: [30, 30]
                                },
                               {
                                 type : 'min',
                                 name: '最小值',
                                 symbol:'image://' + childUrl,
                                 symbolSize: [30, 30]
                               }
                             ]
                            },
                markLine : {
                           data : [ {type : 'average', name: '平均值'} ]
                           }
                     }]
               };
            }
    
     //更新折線圖的縮放起始位置
     function updateZoomState(start,end){
        myChart.setOption({
           dataZoom: [{
                id: 'dataZoom',
                start: start,
                end: end
           }]
       });
     }
    
     //獲取陣列最小值
     function getMinValue(obj){
           var min = obj.steps[0];
           for (var i = 1; i < obj.steps.length; i++){
           if (obj.steps[i] < min){
               min = obj.steps[i];
             }
           }
           return min;
      }
     //獲取陣列最大值
     function getMaxValue(obj){
           var max = obj.steps[0];
           for (var i = 1; i < obj.steps.length; i++){
           if (obj.steps[i] > max) {
               max = obj.steps[i];
             }
           }
           return max;
     }
    
    //更新折線圖資料 繼續在後面追加資料
     function updateDataXY(dataX,dataY){
    
          myChart.setOption({
                xAxis: {
                    id: 'dataX',
                    data:lineJson.times.concat(dataX)
               },
               series:[{
                    id: 'dataY',
                    data:lineJson.steps.concat(dataY)
               }],
               dataZoom: [{
                    id: 'dataZoom',
                    start: 60,
                    end: 100
               }]
           });
     }


  • 展示圖表
  • //顯示圖表
       function createChart(type,json){
    
            if(type=='line'){
              createLineChart(json);
            }
    
            if(type=='bar'){
              createBarChart(json);
            }
    
            if(type=='pie'){
              createPieChart(json);
            }
    
            if(type=='more'){
              createMoreChart()
            }
    
            // 基於準備好的dom,初始化echarts例項
           myChart = echarts.init(document.getElementById('main'));
            //使用指定的配置項和資料顯示圖表。
           myChart.setOption(options);
        }
    


  • html 檔案已寫好  到了安卓中呼叫的時候了
    //進行webwiev的一堆設定
    chartshowWb.getSettings().setAllowFileAccess(true);
    chartshowWb.getSettings().setJavaScriptEnabled(true);
    chartshowWb.loadUrl("file:///android_asset/echart/myechart.html");
    chartshowWb.setWebViewClient(new WebViewClient() {
    
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return super.shouldOverrideUrlLoading(view, url);
        }
    
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
    
            dialog.show();
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
            //最好在這裡呼叫js程式碼 以免網頁未載入完成
            chartshowWb.loadUrl("javascript:createChart('line'," + EchartsDataBean.getInstance().getEchartsLineJson() + ");");
            findViewById(R.id.rl_bottom).setVisibility(View.VISIBLE);
            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }
    });


  • 點選按鈕載入不同的 圖表 
  • @Override
    public void onClick(View view) {
        switch (view.getId()) {
    
            case R.id.linechart_bt:
                chartshowWb.loadUrl("javascript:createChart('line'," + EchartsDataBean.getInstance().getEchartsLineJson() + ");");
                findViewById(R.id.rl_bottom).setVisibility(View.VISIBLE);
                break;
            case R.id.barchart_bt:
                chartshowWb.loadUrl("javascript:createChart('bar'," + EchartsDataBean.getInstance().getEchartsBarJson() + ");");
                findViewById(R.id.rl_bottom).setVisibility(View.GONE);
                break;
            case R.id.piechart_bt:
                chartshowWb.loadUrl("javascript:createChart('pie'," + EchartsDataBean.getInstance().getEchartsPieJson() + ");");
                findViewById(R.id.rl_bottom).setVisibility(View.GONE);
                break;
            case R.id.morechart_bt://createMapChart
                chartshowWb.loadUrl("javascript:createChart('more'," + EchartsDataBean.getInstance().getEchartsLineJson() + ");");
                findViewById(R.id.rl_bottom).setVisibility(View.GONE);
                break;
            case R.id.iv_left:
                dealwithLeft();
                break;
            case R.id.iv_right:
                dealwithRight();
                break;
            default:
                chartshowWb.loadUrl("javascript:updateDataXY(" + newDataX + "," + newDataY + ");");
                findViewById(R.id.rl_bottom).setVisibility(View.VISIBLE);
                break;
        }
    }


  • 至此 通過百度Echarts線上展示統計圖表 已完成   關於動態展示資料  我們可以將要展示的資料封裝成物件 ,
  • 通過Gson將集合轉換成Json資料 作為引數傳入即可  ,  有問題請留言...