關(guān)于Android使用Echarts畫圖表的那些事

0、前言

ECharts 是一個使用 JavaScript 實現(xiàn)的開源可視化庫念祭,且兼容當前絕大部分瀏覽器(IE8/9/10/11兑宇,Chrome,F(xiàn)irefox棒卷,Safari等)及兼容多種設備顾孽,當然也支持在Android中的顯示,主要是通過WebView來加載比规,可隨時隨地任性展示若厚,支持多種圖標樣式的展示。
本文主要從echarts的使用以及在Android中的使用來講解echarts蜒什。

1测秸、如何使用Echarts

首先是下載echarts
如上所述楷兽,下載后的文件為echarts.min.js,是一個JavaScript文件舌仍,如何在html導入該文件盹牧,例如:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!-- 引入 echarts.js -->
   <script type="text/javascript" src="./echarts.min.js"></script>
<script type="text/javascript">
    <!-- 先給echarts顯示的圖表占個位置 -->
<div id="container" style="width: 100%;height: 100%;"></div>

</head>
<body> 
</body>
</html>

而echarts的使用也很簡單,首先是初始化echarts和option:

    <!-- 上文定義的存放echarts的div -->
var dom = document.getElementById("container");
var myChart = echarts.init(dom);
var app = {};
var option;

接下來遵循echarts的語法編寫好options:

<!--這里引用官方的例子-->
option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [150, 230, 224, 218, 135, 147, 260],
      type: 'line'
    }
  ]
};

然后在調(diào)用echarts的setOption方法即可:

<!--注意以下代碼在script里面-->
if (option &&typeof option ==="object") {
       myChart.setOption(option,true);
 }

關(guān)于option的寫法和例子沈撞,見官方例子有很多例子慷荔,本文重點講如何在Android中使用ehcarts

2、Android調(diào)用echarts

如上文所述缠俺,echarts是JavaScript編寫的可視化庫显晶,因此使用echarts主要是在htlm文件中使用,然后通過html實現(xiàn)跨平臺壹士,在Android平臺通過webview控件加載即可展示磷雇。

2.1 htlm加載echarts

還是上文的例子,為了演示躏救,此處先給出完整代碼:

<!--
    THIS EXAMPLE WAS DOWNLOADED FROM https://echarts.apache.org/examples/zh/editor.html?c=bar-simple
-->
<!DOCTYPE html>
<html style="height: 100%">
<head>
    <meta charset="utf-8">
</head>
<body style="height: 100%; margin: 0">
<div id="container" style="width: 100%;height: 100%;"></div>


<script type="text/javascript" src="./echarts.min.js"></script>
<script type="text/javascript">
var dom = document.getElementById("container");
var myChart = echarts.init(dom);
var app = {};
var option;

window.onresize=myChart.resize;


function loadEcharts(dataArray){
                var array = JSON.parse(dataArray);
                <!--這里引用官方的例子-->
                option = {
                  xAxis: {
                    type: 'category',
                    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
                  },
                  yAxis: {
                    type: 'value'
                  },
                  series: [
                    {
                      data: [150, 230, 224, 218, 135, 147, 260],
                      type: 'line'
                    }
                  ]
                };
                if (option &&typeof option ==="object") {
                    myChart.setOption(option,true);
                }
            }
        </script>
</body>
</html>

這里唯笙,在htlm文檔中通過JavaScript定義了一個function loadEcharts(dataArray)方法,為Android加載htlm時提供了一個數(shù)據(jù)傳入接口盒使,其中dataArray可以為任何數(shù)據(jù)崩掘,一般使用json格式的數(shù)據(jù),以便實現(xiàn)傳入多數(shù)據(jù)少办,然后在通過JSON解析取出數(shù)據(jù):

 var array = JSON.parse(dataArray);
 var xData=array.data;
 var sData=array.series;

2.2 webview加載htlm

首先呢堰,在上文寫好html文件后,放入assets包里面(配置asset

的方法請自行百度)凡泣,以供加載枉疼,本項目用到的html文件如下所示:


image.png

接著,自定義一個webview

package echarts_view;

import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebSettings;
import android.webkit.WebView;

import comment.LogUit;

public class EchartView extends WebView {
    private static final String TAG = EchartView.class.getSimpleName();

    public EchartView(Context context) {
        this(context, null);
    }

    public EchartView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public EchartView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //配置webview鞋拟,設定加載的url文件路勁
    public void init(String url) {
        WebSettings webSettings = getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setSupportZoom(false);
        webSettings.setDisplayZoomControls(false);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        loadUrl(url);
    }

    /**刷新圖表
     */
     public void refreshEchartsWithOption(Object value) {
        LogUit.INSTANCE.printE("TablePrint","init-refresh value="+value);
         String call = "javascript:loadEcharts('" + value+ "')";
        loadUrl(call);
    }
}

以上文的例子為例骂维,在本地寫好這個html文件后,通過這個自定義webview的init方法贺纲,傳入路勁(比如file:///android_asset/normal_heart.html)航闺,然后根據(jù)需要配置好webview,即可使用webview加載裝載echarts的html頁面猴誊。
之后通過refreshEchartsWithOption方法潦刃,傳入value(即options中動態(tài)變化的值),即可刷新并加載圖表懈叹。
注意:refreshEchartsWithOption方法須在html的標簽加載完成之后調(diào)用,即在WebViewClient的onPageFinished方法中調(diào)用:

 private val client: WebViewClient?=object : WebViewClient() {
        override fun onPageFinished(view: WebView, url: String) {
            super.onPageFinished(view, url)
            refreshLineChart(value)
        }
    }

此處給出在fragment里面調(diào)用的例子:

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.day_blood_page_fg, container, false)
        echar_day = view.findViewById(R.id.echar_day)
        echar_day!!.webViewClient =client
        echar_day!!.init(url)
        return view
    }
......
//傳入value的值乖杠,刷新圖表
echar_day!!.refreshEchartsWithOption(value)

3、小結(jié)

至此澄成,Android使用echarts的方法介紹結(jié)束胧洒,主要可分為以下幾步:

  1. 創(chuàng)建html文件畏吓,導入echarts.min.js庫
  2. html中構(gòu)造options,提供接口供Android端傳入動態(tài)變化的值
  3. 自定義webview卫漫,加載html頁面菲饼,傳入動態(tài)變化的值刷新圖表

當然,如果不需要動態(tài)改變options里面的值列赎,可不傳入數(shù)據(jù)宏悦。

原創(chuàng)文章,轉(zhuǎn)載請附上原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末包吝,一起剝皮案震驚了整個濱河市肛根,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漏策,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼氨,死亡現(xiàn)場離奇詭異掺喻,居然都是意外死亡,警方通過查閱死者的電腦和手機储矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門感耙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人持隧,你說我怎么就攤上這事即硼。” “怎么了屡拨?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵只酥,是天一觀的道長。 經(jīng)常有香客問我呀狼,道長裂允,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任哥艇,我火速辦了婚禮绝编,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘貌踏。我一直安慰自己十饥,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布祖乳。 她就那樣靜靜地躺著逗堵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眷昆。 梳的紋絲不亂的頭發(fā)上砸捏,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天谬运,我揣著相機與錄音,去河邊找鬼垦藏。 笑死梆暖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的掂骏。 我是一名探鬼主播轰驳,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弟灼!你這毒婦竟也來了级解?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤田绑,失蹤者是張志新(化名)和其女友劉穎勤哗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掩驱,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡芒划,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欧穴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片民逼。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涮帘,靈堂內(nèi)的尸體忽然破棺而出拼苍,到底是詐尸還是另有隱情,我是刑警寧澤调缨,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布疮鲫,位于F島的核電站,受9級特大地震影響弦叶,放射性物質(zhì)發(fā)生泄漏棚点。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一湾蔓、第九天 我趴在偏房一處隱蔽的房頂上張望瘫析。 院中可真熱鬧,春花似錦默责、人聲如沸贬循。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杖虾。三九已至,卻和暖如春媒熊,著一層夾襖步出監(jiān)牢的瞬間奇适,已是汗流浹背坟比。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嚷往,地道東北人葛账。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像皮仁,于是被迫代替她去往敵國和親籍琳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容