畫(huà)圖表工具M(jìn)PAndroidChart ——折線(xiàn)圖

2017.10.19

效果

可以添加多條折線(xiàn),動(dòng)態(tài)的獲取加載數(shù)據(jù)。

//畫(huà)圖表工具M(jìn)PAndroidChart

compile'com.github.PhilJay:MPAndroidChart:v3.0.1'


1.在app的build.gradle中添加


2.根據(jù)網(wǎng)上的資料寫(xiě)了一個(gè)DynamicLineChartManager


/**

* Created by wxz 2017/10/16.

*/

public classDynamicLineChartManager {

privateLineChartlineChart;

privateYAxisleftAxis;

privateYAxisrightAxis;

privateXAxisxAxis;

privateLineDatalineData;

privateLineDataSetlineDataSet;

privateListlineDataSets=newArrayList<>();

privateSimpleDateFormatdf=newSimpleDateFormat("HH:mm:ss");//設(shè)置日期格式

privateListtimeList=newArrayList<>();//存儲(chǔ)x軸的時(shí)間

//一條曲線(xiàn)

publicDynamicLineChartManager(LineChart mLineChart, String name,intcolor) {

this.lineChart= mLineChart;

leftAxis=lineChart.getAxisLeft();

rightAxis=lineChart.getAxisRight();

xAxis=lineChart.getXAxis();

initLineChart();

initLineDataSet(name, color);

}

//多條曲線(xiàn)

publicDynamicLineChartManager(LineChart mLineChart, List names, List colors) {

this.lineChart= mLineChart;

leftAxis=lineChart.getAxisLeft();

rightAxis=lineChart.getAxisRight();

xAxis=lineChart.getXAxis();

initLineChart();

initLineDataSet(names, colors);

}

/**

* 初始化LineChar

*/

private voidinitLineChart() {

lineChart.setDrawGridBackground(false);

//顯示邊界

lineChart.setDrawBorders(true);

//折線(xiàn)圖例 標(biāo)簽 設(shè)置

Legend legend =lineChart.getLegend();

legend.setForm(Legend.LegendForm.LINE);

legend.setTextSize(11f);

//顯示位置

legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);

legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);

legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);

legend.setDrawInside(false);

//X軸設(shè)置顯示位置在底部

xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

xAxis.setGranularity(1f);

xAxis.setLabelCount(10);

xAxis.setValueFormatter(newIAxisValueFormatter() {

@Override

publicString getFormattedValue(floatvalue, AxisBase axis) {

returntimeList.get((int) value %timeList.size());

}

});

//保證Y軸從0開(kāi)始毫捣,不然會(huì)上移一點(diǎn)

leftAxis.setAxisMinimum(0f);

rightAxis.setAxisMinimum(0f);

}

/**

* 初始化折線(xiàn)(一條線(xiàn))

*

*@paramname

*@paramcolor

*/

private voidinitLineDataSet(String name,intcolor) {

lineDataSet=newLineDataSet(null, name);

lineDataSet.setLineWidth(1.5f);

lineDataSet.setCircleRadius(1.5f);

lineDataSet.setColor(color);

lineDataSet.setCircleColor(color);

lineDataSet.setHighLightColor(color);

//設(shè)置曲線(xiàn)填充

lineDataSet.setDrawFilled(false);

lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);

lineDataSet.setValueTextSize(10f);

lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);

//添加一個(gè)空的 LineData

lineData=newLineData();

lineChart.setData(lineData);

lineChart.invalidate();

}

/**

* 初始化折線(xiàn)(多條線(xiàn))

*

*@paramnames

*@paramcolors

*/

private voidinitLineDataSet(List names, List colors) {

for(inti =0; i < names.size(); i++) {

lineDataSet=newLineDataSet(null, names.get(i));

lineDataSet.setColor(colors.get(i));

lineDataSet.setLineWidth(1.5f);

lineDataSet.setCircleRadius(1.5f);

lineDataSet.setColor(colors.get(i));

lineDataSet.setDrawFilled(true);

lineDataSet.setCircleColor(colors.get(i));

lineDataSet.setHighLightColor(colors.get(i));

lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);

lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);

lineDataSet.setValueTextSize(10f);

lineDataSets.add(lineDataSet);

}

//添加一個(gè)空的 LineData

lineData=newLineData();

lineChart.setData(lineData);

lineChart.invalidate();

}

/**

* 動(dòng)態(tài)添加數(shù)據(jù)(一條折線(xiàn)圖,單個(gè)數(shù)據(jù)添加)

*

*@param number

*/

public voidaddEntry(intnumber) {

//最開(kāi)始的時(shí)候才添加 lineDataSet(一個(gè)lineDataSet 代表一條線(xiàn))

if(lineDataSet.getEntryCount() ==0) {

lineData.addDataSet(lineDataSet);

}

lineChart.setData(lineData);

//避免集合數(shù)據(jù)過(guò)多,及時(shí)清空(做這樣的處理培漏,并不知道有沒(méi)有用溪厘,但還是這樣做了)

if(timeList.size() >11) {

timeList.clear();

}

timeList.add(df.format(System.currentTimeMillis()));

Entry entry =newEntry(lineDataSet.getEntryCount(), number);

lineData.addEntry(entry,0);

//通知數(shù)據(jù)已經(jīng)改變

lineData.notifyDataChanged();

lineChart.notifyDataSetChanged();

//設(shè)置在曲線(xiàn)圖中顯示的最大數(shù)量

lineChart.setVisibleXRangeMaximum(10);

//移到某個(gè)位置

lineChart.moveViewToX(lineData.getEntryCount() -5);

}

/**

* 動(dòng)態(tài)添加數(shù)據(jù)(一條條折線(xiàn)圖,多個(gè)數(shù)據(jù)添加)

*@paramnumbers

*/

public voidaddEntry(List numbers) {

if(lineDataSet.getEntryCount() ==0) {

lineData.addDataSet(lineDataSet);

}

//? ? ? ? if (lineDataSets.get(0).getEntryCount() == 0) {

//? ? ? ? ? ? lineData = new LineData(lineDataSets);

//? ? ? ? ? ? lineChart.setData(lineData);

//? ? ? ? }

if(timeList.size() >11) {

timeList.clear();

}

timeList.add(df.format(System.currentTimeMillis()));

for(inti =0; i < numbers.size(); i++) {

Entry entry =newEntry(lineDataSet.getEntryCount(), numbers.get(i));

lineData.addEntry(entry,0);

}

lineData.notifyDataChanged();

lineChart.notifyDataSetChanged();

lineChart.setVisibleXRangeMaximum(50);

lineChart.moveViewToX(lineData.getEntryCount() -5);

}

/**

* 設(shè)置Y軸值

*@parammax

*@parammin

*@paramlabelCount

*/

public voidsetYAxis(floatmax,floatmin,intlabelCount) {

if(max < min) {

return;

}

leftAxis.setAxisMaximum(max);

leftAxis.setAxisMinimum(min);

leftAxis.setLabelCount(labelCount,false);

rightAxis.setAxisMaximum(max);

rightAxis.setAxisMinimum(min);

rightAxis.setLabelCount(labelCount,false);

lineChart.invalidate();

}

/**

* 設(shè)置高限制線(xiàn)

*

*@paramhigh

*@paramname

*/

public voidsetHightLimitLine(floathigh, String name,intcolor) {

if(name ==null) {

name ="高限制線(xiàn)";

}

LimitLine hightLimit =newLimitLine(high, name);

hightLimit.setLineWidth(4f);

hightLimit.setTextSize(10f);

hightLimit.setLineColor(color);

hightLimit.setTextColor(color);

leftAxis.addLimitLine(hightLimit);

lineChart.invalidate();

}

/**

* 設(shè)置低限制線(xiàn)

*

*@paramlow

*@paramname

*/

public voidsetLowLimitLine(intlow, String name) {

if(name ==null) {

name ="低限制線(xiàn)";

}

LimitLine hightLimit =newLimitLine(low, name);

hightLimit.setLineWidth(4f);

hightLimit.setTextSize(10f);

leftAxis.addLimitLine(hightLimit);

lineChart.invalidate();

}

/**

* 設(shè)置描述信息

*

*@paramstr

*/

public voidsetDescription(String str) {

Description description =newDescription();

description.setText(str);

lineChart.setDescription(description);

lineChart.invalidate();

}

}




在Activity中的使用


private voidinitLineChart() {

LineChart mLineChart = (LineChart) findViewById(R.id.ppg_chart);

//折線(xiàn)名稱(chēng)

names.add("測(cè)試");

//? ? ? ? names.add("測(cè)試二");

//? ? ? ? names.add("測(cè)試三");

//折線(xiàn)顏色

colour.add(Color.CYAN);

//? ? ? ? colour.add(Color.GREEN);

//? ? ? ? colour.add(Color.BLUE);

dynamicLineChartManager1=newDynamicLineChartManager(mLineChart,names.get(0),colour.get(0));

//? ? ? ? dynamicLineChartManager1.setYAxis(100, 0, 10);

//死循環(huán)添加數(shù)據(jù)

new Thread(newRunnable() {

@Override

public voidrun() {

while(true) {

try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

runOnUiThread(newRunnable() {

@Override

public voidrun() {

//? ? ? ? ? ? ? ? ? ? ? ? ? ? list.add((int) (Math.random() * 50) + 10);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? list.add((int) (Math.random() * 80) + 10);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? list.add((int) (Math.random() * 100));

//? ? ? ? ? ? ? ? ? ? ? ? ? ? list.add((int) (Math.random() * 50) + 10);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? list.add((int) (Math.random() * 80) + 10);

//? ? ? ? ? ? ? ? ? ? ? ? ? ? list.add((int) (Math.random() * 200));

list.add((int) (Math.random() *50) +10);

list.add((int) (Math.random() *80) +10);

list.add((int) (Math.random() *100));

list.add((int) (Math.random() *50) +10);

dynamicLineChartManager1.addEntry(list);

list.clear();

}

});

}

}

}).start();

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牌柄,一起剝皮案震驚了整個(gè)濱河市畸悬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珊佣,老刑警劉巖蹋宦,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咒锻,居然都是意外死亡冷冗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)惑艇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒿辙,“玉大人,你說(shuō)我怎么就攤上這事滨巴∷脊啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵恭取,是天一觀的道長(zhǎng)泰偿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蜈垮,這世上最難降的妖魔是什么耗跛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮攒发,結(jié)果婚禮上调塌,老公的妹妹穿的比我還像新娘。我一直安慰自己惠猿,他們只是感情好烟阐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著紊扬,像睡著了一般蜒茄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上餐屎,一...
    開(kāi)封第一講書(shū)人閱讀 49,837評(píng)論 1 290
  • 那天檀葛,我揣著相機(jī)與錄音,去河邊找鬼腹缩。 笑死屿聋,一個(gè)胖子當(dāng)著我的面吹牛空扎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播润讥,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼转锈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了楚殿?” 一聲冷哼從身側(cè)響起撮慨,我...
    開(kāi)封第一講書(shū)人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脆粥,沒(méi)想到半個(gè)月后砌溺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡变隔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年规伐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匣缘。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猖闪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肌厨,到底是詐尸還是另有隱情萧朝,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布夏哭,位于F島的核電站,受9級(jí)特大地震影響献联,放射性物質(zhì)發(fā)生泄漏竖配。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一里逆、第九天 我趴在偏房一處隱蔽的房頂上張望进胯。 院中可真熱鬧,春花似錦原押、人聲如沸胁镐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盯漂。三九已至,卻和暖如春笨农,著一層夾襖步出監(jiān)牢的瞬間就缆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工谒亦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竭宰,地道東北人空郊。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像切揭,于是被迫代替她去往敵國(guó)和親狞甚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)廓旬。 張土汪:刷leetcod...
    土汪閱讀 12,738評(píng)論 0 33
  • afinalAfinal是一個(gè)android的ioc哼审,orm框架 https://github.com/yangf...
    passiontim閱讀 15,411評(píng)論 2 45
  • //Clojure入門(mén)教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 3,629評(píng)論 0 7
  • 雄鷹志(我主沉浮) 生于青云巔嗤谚,鳥(niǎo)瞰千郡里棺蛛。 心慕騰九州,豈甘零星羽巩步。 戰(zhàn)鼓三萬(wàn)丈旁赊,一躍登高起。 蒼穹妒我翼椅野,風(fēng)削...
    我主沉浮666閱讀 166評(píng)論 0 0
  • 晚上终畅,我在臥室看書(shū),娃爸在客廳沙發(fā)上看手機(jī)竟闪,兒子在客廳一圈一圈地騎著他的四輪助動(dòng)車(chē)离福,不一會(huì)兒,我就聽(tīng)到娃爸“啊”的...
    紅懿閱讀 296評(píng)論 0 2