Android 折線圖表MPAndroidChart的實現(xiàn)

昨日夜觀天象嗡载,今日忽見北斗星隕落惩琉,《Android 折線圖表》應運而生闷供。


single.png

many.png

一.本篇采用MPAndroidChart烟央,大體實現(xiàn)步驟可分為兩步:

  1.配置基本屬性(包括X,Y軸)
  2.設置折線數(shù)據(jù)并添加

二.
第一步,配置基本屬性歪脏。

1.依賴:

      當前工程Build.gradle里: implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
      項目Build.gradle里:

            allprojects {
                  repositories {
                  maven { url "https://jitpack.io" }
                  }
            }

2.配置圖表控件的基本屬性:

/**
 * 設置Chart的一些基本配置
 */
private void initChart() {
    //配置基本信息
    lineChart.getDescription().setEnabled(false);   //設置描述
    lineChart.setTouchEnabled(true);    //設置是否可以觸摸
    lineChart.setDragDecelerationFrictionCoef(0.9f);    //設置滾動時的速度快慢
    lineChart.setDragEnabled(true);     // 是否可以拖拽
    lineChart.setScaleXEnabled(false);   //設置X軸是否能夠放大
    lineChart.setScaleYEnabled(false);  //設置Y軸是否能夠放大
    //lineChart.setScaleEnabled(true);    // 是否可以縮放 x和y軸, 默認是true
    lineChart.setDrawGridBackground(false);//設置圖表內(nèi)格子背景是否顯示疑俭,默認是false
    lineChart.setHighlightPerDragEnabled(true);//能否拖拽高亮線(數(shù)據(jù)點與坐標的提示線),默認是true
    lineChart.setBackgroundColor(Color.WHITE);  //設置背景顏色

    //配置X軸屬性
    xAxis = lineChart.getXAxis();

    //xAxis.setLabelRotationAngle(25f);  //設置旋轉(zhuǎn)偏移量
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);  //設置X軸的位置
    //設置標簽文本格式
    xAxis.setTextSize(10f);
    //設置標簽文本顏色
    xAxis.setTextColor(Color.rgb(255, 192, 56));
    //是否繪制軸線
    xAxis.setDrawAxisLine(true);
    //是否繪制網(wǎng)格線
    xAxis.setDrawGridLines(false);
    //設置是否一個格子顯示一條數(shù)據(jù)婿失,如果不設置這個屬性钞艇,就會導致X軸數(shù)據(jù)重復并且錯亂的問題
    xAxis.setGranularity(1f);

    //配置Y軸信息
    leftAxis = lineChart.getAxisLeft();
    leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);   //設置Y軸的位置
    leftAxis.setDrawGridLines(true);    //設置左邊的網(wǎng)格線顯示
    leftAxis.setGranularityEnabled(false);//啟用在放大時限制y軸間隔的粒度特性。默認值:false豪硅。
    leftAxis.setTextColor(Color.rgb(255, 192, 56)); //設置Y軸文字顏色

    YAxis rightAxis = lineChart.getAxisRight(); //獲取右邊的Y軸
    rightAxis.setEnabled(false);   //設置右邊的Y軸不顯示

    //設置圖例(也就是曲線的標簽)
    Legend legend = lineChart.getLegend();//設置比例圖
    legend.setEnabled(false);   //因為自帶的圖例太丑哩照,而且操作也不方便,樓主選擇自定義懒浮,設置不顯示比例圖
}

第二步葡秒,設置折線數(shù)據(jù)。

首先嵌溢,自定義我們的X軸適配器:

public class MyXFormatter  implements IAxisValueFormatter {

private List<String> list;

public MyXFormatter(List<String> values) {
    this.list = values;
}

private static final String TAG = "MyXFormatter";

@Override
public String getFormattedValue(float value, AxisBase axis) {
    // "value" represents the position of the label on the axis (x or y)
    Log.d(TAG, "----->getFormattedValue: " + value) ;
    if (value<list.size()){
        return list.get((int) (value));
    }else {
        return null;
    }
  }
}

然后眯牧,設置折線數(shù)據(jù)。單條折線的數(shù)據(jù)方法設置如下:

/**
 * 設置單條折線的數(shù)據(jù)
 * count 單條折線的數(shù)據(jù)量
 */
private void setSingleDatas(int count) {
    //設置單條折線的X軸數(shù)據(jù)
    singleNameList = new ArrayList<>();
    for (int i = 0; i < count; i++) {
        int j = i+1;
        singleNameList.add(j + "月");
    }
    //將X軸數(shù)據(jù)傳入自定義的X軸ValueFormatter
    MyXFormatter formatter = new MyXFormatter(singleNameList);
    xAxis.setValueFormatter(formatter);

    //設置單條折現(xiàn)的Y軸數(shù)據(jù)
    ArrayList<Entry> yList = new ArrayList<Entry>();
    for (int i = 0; i < count; i++) {
       float value = (float) (Math.random()*100);
       yList.add(new Entry(i,value));
    }

    LineDataSet lineDataSet = new LineDataSet(yList, "單條折線");   //設置單條折線
    ArrayList<ILineDataSet> dataSets = new ArrayList<>();
    //設置折線的屬性
    lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);   //設置左右兩邊Y軸節(jié)點描述
    lineDataSet.setValueTextColor(ColorTemplate.getHoloBlue()); //設置節(jié)點文字顏色
    lineDataSet.setDrawCircles(false);  //設置是否顯示節(jié)點的小圓點
    lineDataSet.setDrawValues(false);       //設置是否顯示節(jié)點的值
    lineDataSet.setHighLightColor(Color.rgb(244, 117, 117));//當點擊節(jié)點時赖草,將會出現(xiàn)與節(jié)點水平和垂直的兩條線学少,可以對其進行定制.此方法為設置線條顏色
    lineDataSet.setHighlightEnabled(true);//設置是否顯示十字線
    lineDataSet.setColor(Color.BLUE);    //設置線條顏色
    lineDataSet.setCircleColor(Color.WHITE);  //設置節(jié)點的圓圈顏色
    lineDataSet.setLineWidth(1f);   //設置線條寬度
    lineDataSet.setCircleRadius(4f);//設置每個坐標點的圓大小
    lineDataSet.setDrawCircleHole(false);//是否定制節(jié)點圓心的顏色,若為false秧骑,則節(jié)點為單一的同色點版确,若為true則可以設置節(jié)點圓心的顏色
    lineDataSet.setValueTextSize(9f);   //設置 DataSets 數(shù)據(jù)對象包含的數(shù)據(jù)的值文本的大小(單位是dp)乎折。
    //設置折線圖填充
    lineDataSet.setDrawFilled(false);    //Fill填充绒疗,可以將折線圖以下部分用顏色填滿
    lineDataSet.setFillAlpha(65);       ////設置填充區(qū)域透明度,默認值為85
    lineDataSet.setFillColor(ColorTemplate.getHoloBlue());//設置填充顏色
    lineDataSet.setFormLineWidth(1f);
    lineDataSet.setFormSize(15.f);

    dataSets.add(lineDataSet);

    LineData data = new LineData(dataSets);
    lineChart.setData(data);    //添加數(shù)據(jù)
}

多條折線的數(shù)據(jù)設置方法如下:

/**
 * 設置多條折線的數(shù)據(jù)
 * @param chartData //線條x軸的個數(shù)
 * @param count     //線條的個數(shù)
 */
private void setManyDatas(int chartData, int count) {
    singleNameList = new ArrayList<>();
    for (int i = 0; i < chartData; i++) {
        int j = i+1;
        singleNameList.add(j + "月");
    }
    MyXFormatter formatter = new MyXFormatter(singleNameList);
    xAxis.setValueFormatter(formatter);

    initChartColors();  //設置線條顏色集合
    initChartNames(count);   //設置不同線條名字的集合
    ArrayList<ILineDataSet> dataSets = new ArrayList<>();   //線條數(shù)據(jù)集合

    for (int i = 0; i < count; i++) {
        //設置單條折現(xiàn)的Y軸數(shù)據(jù)
        ArrayList<Entry> yList = new ArrayList<Entry>();
        for (int j = 0; j < chartData; j++) {
            float value = (float) (Math.random()*100);
            yList.add(new Entry(j,value));
        }

        LineDataSet lineDataSet = new LineDataSet(yList, nameList.get(i));   //設置單條折線
        //設置折線的屬性
        lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);   //設置左右兩邊Y軸節(jié)點描述
        lineDataSet.setValueTextColor(ColorTemplate.getHoloBlue()); //設置節(jié)點文字顏色
        lineDataSet.setDrawCircles(false);  //設置是否顯示節(jié)點的小圓點
        lineDataSet.setDrawValues(false);       //設置是否顯示節(jié)點的值
        lineDataSet.setHighLightColor(Color.rgb(244, 117, 117));//當點擊節(jié)點時骂澄,將會出現(xiàn)與節(jié)點水平和垂直的兩條線吓蘑,可以對其進行定制.此方法為設置線條顏色
        lineDataSet.setHighlightEnabled(true);//設置是否顯示十字線
        lineDataSet.setColor(colours.get(i));    //設置線條顏色
        lineDataSet.setCircleColor(Color.WHITE);  //設置節(jié)點的圓圈顏色
        lineDataSet.setLineWidth(1f);   //設置線條寬度
        lineDataSet.setCircleRadius(4f);//設置每個坐標點的圓大小
        lineDataSet.setDrawCircleHole(false);//是否定制節(jié)點圓心的顏色,若為false坟冲,則節(jié)點為單一的同色點磨镶,若為true則可以設置節(jié)點圓心的顏色
        lineDataSet.setValueTextSize(9f);   //設置 DataSets 數(shù)據(jù)對象包含的數(shù)據(jù)的值文本的大小(單位是dp)健提。
        //設置折線圖填充
        lineDataSet.setDrawFilled(false);    //Fill填充琳猫,可以將折線圖以下部分用顏色填滿
        lineDataSet.setFillAlpha(65);       ////設置填充區(qū)域透明度,默認值為85
        lineDataSet.setFillColor(ColorTemplate.getHoloBlue());//設置填充顏色
        lineDataSet.setFormLineWidth(1f);
        lineDataSet.setFormSize(15.f);
        dataSets.add(lineDataSet);
    }
    LineData data = new LineData(dataSets);
    lineChart.setData(data);    //添加數(shù)據(jù)

}

  /**
 * 設置線條名字集合
 * @param count
 */
private void initChartNames(int count) {
    nameList = new ArrayList<>();
    for (int i = 0; i < count; i++) {
        int j = i+1;
        String name = "線條" + j;
        nameList.add(name);
    }
}

/**
 * 提前設置顏色集合
 */
private void initChartColors() {
    //顏色集合
    colours = new ArrayList<>();
    colours.add(Color.GREEN);
    colours.add(Color.BLUE);
    colours.add(Color.RED);
    colours.add(Color.CYAN);
    colours.add(Color.BLACK);
    colours.add(Color.GRAY);
}

由上代碼私痹,相信看官老爺們不難看出脐嫂,單條折線和多條折線的實現(xiàn)思路其實有異曲同工之妙统刮。都是創(chuàng)建了一個ArrayList<ILineDataSet>集合,添加LineDataSet 對象并設置屬性账千。最后將此集合通過LineData的構(gòu)造方法网沾,調(diào)用圖表對象的.setData()方法進行添加的。

補充:

圖例蕊爵,也就是這玩意


image.png

最好自己定義,寫個GirdView就可以了桦山。還能自動換行攒射,美滋滋。官方的不多說恒水,丑而且自動換行有問題会放。

三.踩坑之處:

1.自定義X軸數(shù)據(jù)。
這里有一個不得不說的要點钉凌,我們在自定義X軸數(shù)據(jù)咧最,創(chuàng)建自己的IAxisValueFormatter實現(xiàn)類時,一定要注意提前設置 X軸的這個屬性:

//設置是否一個格子顯示一條數(shù)據(jù)
xAxis.setGranularity(1f);

如果不設置這個屬性御雕,就會導致X軸數(shù)據(jù)重復并且錯亂矢沿,原因是IAxisValueFormatter實現(xiàn)類的的方法getFormattedValue(float value, AxisBase axis)中的value返回錯亂。

2.數(shù)據(jù)刷新酸纲。

如果你實現(xiàn)了自己的圖表控件捣鲸,并且有多種類型的數(shù)據(jù)需要重復設置,需要刷新圖表控件時闽坡,若有X軸經(jīng)常顯示錯亂的問題栽惶,不妨多調(diào)用一次lineChart.setData(data);方法。

四.到此疾嗅,就已經(jīng)實現(xiàn)了折線圖表的功能外厂。隨手分享,喜歡的朋友可以關(guān)注微信公眾號MiHomes代承,后續(xù)會有更多更好的博客推送給您汁蝶。


MiHomes.png

另:歡迎指出不足,會進行更正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末论悴,一起剝皮案震驚了整個濱河市穿仪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌意荤,老刑警劉巖啊片,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玖像,居然都是意外死亡紫谷,警方通過查閱死者的電腦和手機齐饮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笤昨,“玉大人祖驱,你說我怎么就攤上這事÷髦希” “怎么了捺僻?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長崇裁。 經(jīng)常有香客問我匕坯,道長,這世上最難降的妖魔是什么拔稳? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任葛峻,我火速辦了婚禮,結(jié)果婚禮上巴比,老公的妹妹穿的比我還像新娘术奖。我一直安慰自己,他們只是感情好轻绞,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布采记。 她就那樣靜靜地躺著,像睡著了一般政勃。 火紅的嫁衣襯著肌膚如雪挺庞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天稼病,我揣著相機與錄音选侨,去河邊找鬼。 笑死然走,一個胖子當著我的面吹牛援制,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芍瑞,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晨仑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拆檬?” 一聲冷哼從身側(cè)響起洪己,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竟贯,沒想到半個月后答捕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡屑那,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年拱镐,在試婚紗的時候發(fā)現(xiàn)自己被綠了艘款。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沃琅,死狀恐怖哗咆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情益眉,我是刑警寧澤晌柬,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站郭脂,受9級特大地震影響年碘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朱庆,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闷祥。 院中可真熱鬧娱颊,春花似錦、人聲如沸凯砍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悟衩。三九已至剧罩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間座泳,已是汗流浹背惠昔。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挑势,地道東北人镇防。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像潮饱,于是被迫代替她去往敵國和親来氧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355