MPAndroidChart簡單使用


所有演示都采用 MPAndroidChart v3.1.0

 

官方地址:https://github.com/PhilJay/MPAndroidChart

 

首先要感謝作者寫出這么強大的圖表控件讓我們免費使用,如果您條件勻許可以a coffee (or some beer) for him。

 

工作中,經常會用到圖表控件,以直觀的方式來給用戶感性的認識,可以是門店銷量比對,可以是門店的日月報表,也可以是會員消費的排行等等。

 

工欲善其事,必先利其器。

好的工具,不會用,也是枉然。

然而,好的東西肯定有它一定的使用方法,如何簡單的使用,那就需要有人嘗試,有人研究。

然后結果證明,使用往往是簡單的,但是不了解的時候,會花費大量的時間與精力,到最好可能也就是一行代碼的事。

這也是我來寫這個的初衷吧。

 

這里我來講一下我們在工作中實際業務中,是如何來處理這個報表控件的。

 1、先來了解下它

 

 

 

以上的截圖是官方提供的例子,這個很重要,因為他給我們提供了很大的幫助,好多都可以直接搬過來用,不需要再去看文檔。

其中包括:Line Charts折線圖 Bar Charts柱狀圖 Pie Charts餅圖 Other Charts其它……

1)如何打開這個例子:

我使用的是Android Studio 3.5.3 , 前段時間剛剛升級,其實如果是維護產品的話,升級不升級,還要看情況。

有個前提:在使用第三方提供的Lib的時候,我們得跟上這個源程序的Lib,好多時候,我們一轉眼,有些項目就升級了,原來的API就不存在了,或者在網上找了一堆關於這個第三方控件的,因為版本的問題,根本就用不上,當你比較着急做項目的時候,特別是加班,我想如果你做過幾年開發,那肯定是有心德體會的。

打開Android Studio, File -- Open

 

打開后,會有些jar的下載過程,稍等下,在這里,我碰到了很多問題,大體上是握手沒有通過,后來找了下,才知道是我開了防火牆。關了重新打開就可以,稍等下,一切都會OK。

打開后,我們會發現有二個Modules

 

 一個是Example(例子),另一個是Lib(提供API)

點擊 “運行” 就可以安裝到手機上,或者模擬器上,我一般在真機上測試。

好了,到此例子就運行了,有興趣可以自已先看一下。

2)我們來看看一個圖表,大概有幾部分組成

v 先上一張圖,也就是例子中的第一張圖

 

 

這是個折線圖,有X軸,Y軸(一般左右各一個,這里右邊的Y軸隱藏了),Legend, Limit Line。

x軸:chart.getXAxis();  chart代表是圖表對象,x軸可以設置在上,還是在下顯示。

XAxis xl = chart.getXAxis();
xl.setPosition(XAxisPosition.BOTTOM);

這里設置顯示在下方。

 

y軸:

YAxis yl = chart.getAxisLeft();左側的Y軸。

YAxis yr = chart.getAxisRight();右側的Y軸。

 

Legend:說明區別各個圖表類型特定的設置,比如說各個門店的對比,我們可以自定義這個Legend來加一個適合我們項目的說明。

 

這里的門店就是Legend區域。

 

Limit Line:  限制線;極限線;界線 , 比如說我們要寫一個產品合格率的,這個就挺不錯的,到哪是合格,那是不合格的,這樣一目了然。

圖中的虛線Upper Limit,Lower Limit就是一個Limit Line ,當然樣式也是可以自定義的

 

 

2、實例中我們是如何來使用的

1)一般我們在做項目的時候,都會有步驟,我們來看一下加入圖表一般有幾個步驟

2)步驟

u XML中加入這個控件

<com.github.mikephil.charting.charts.HorizontalBarChart
    android:id="@+id/chart1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:layout_above="@+id/seekBar1" />

u 代碼中我們要拿到這個控件

private HorizontalBarChart chart;

 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        

chart = findViewById(R.id.chart1);
          chart.setOnChartValueSelectedListener(this);    

……

}

 

u 對這個控件作一些設置,這步完成以后,大體的框架出來了

  //在圖表上顯示值
        chart.setDrawValueAboveBar(true);
    //不顯示圖表中的說明
        chart.getDescription().setEnabled(false);

        // if more than 60 entries are displayed in the chart, no values will be
        // drawn
        chart.setMaxVisibleValueCount(60);

        // scaling can now only be done on x- and y-axis separately
        chart.setPinchZoom(false);

        // draw shadows for each bar that show the maximum value
        // chart.setDrawBarShadow(true);

        chart.setDrawGridBackground(false);
       //x軸
        XAxis xl = chart.getXAxis();
        xl.setPosition(XAxisPosition.BOTTOM);
        xl.setTypeface(tfLight);
        xl.setDrawAxisLine(true);
        xl.setDrawGridLines(false);
        xl.setGranularity(10f);

//y軸 左側
        YAxis yl = chart.getAxisLeft();
        yl.setTypeface(tfLight);
        yl.setDrawAxisLine(true);
        yl.setDrawGridLines(true);
        yl.setAxisMinimum(0f); // this replaces setStartAtZero(true)
//        yl.setInverted(true);


//y軸 左側
        YAxis yr = chart.getAxisRight();
        yr.setTypeface(tfLight);
        yr.setDrawAxisLine(true);
        yr.setDrawGridLines(false);
        yr.setAxisMinimum(0f); // this replaces setStartAtZero(true)
//        yr.setInverted(true);

 

u 給圖表一個數據,讓其能顯示出來

ArrayList<Entry> values = new ArrayList<>();

for (int i = 0; i < count; i++) {

    float val = (float) (Math.random() * range) - 30;
    values.add(new Entry(i, val, getResources().getDrawable(R.drawable.star)));
}

LineDataSet set1;

 

if (chart.getData() != null &&
        chart.getData().getDataSetCount() > 0) {
    set1 = (LineDataSet) chart.getData().getDataSetByIndex(0);
    set1.setValues(values);
    set1.notifyDataSetChanged();
    chart.getData().notifyDataChanged();
    chart.notifyDataSetChanged();
} else {
    // create a dataset and give it a type
    set1 = new LineDataSet(values, "DataSet 1");

}

如果存在dataset,那么直接賦值,如果不存在,那么新建一個。

 

加到數據到DataSet , 展示數據

ArrayList<ILineDataSet> dataSets = new ArrayList<>();
dataSets.add(set1); // add the data sets
這里可以增加多條折線,只要有多個數據,多個LineDataSet即可。
// create a data object with the data sets
LineData data = new LineData(dataSets);

// set data
chart.setData(data);

 

這樣我們基本上是有個概念了,為下面的實例來作准備。


免責聲明!

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



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