画图表工具MPAndroidChart ——折线图

2017.10.19

效果

可以添加多条折线,动态的获取加载数据。

//画图表工具MPAndroidChart

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


1.在app的build.gradle中添加


2.根据网上的资料写了一个DynamicLineChartManager


/**

* Created by wxz 2017/10/16.

*/

public classDynamicLineChartManager {

privateLineChartlineChart;

privateYAxisleftAxis;

privateYAxisrightAxis;

privateXAxisxAxis;

privateLineDatalineData;

privateLineDataSetlineDataSet;

privateListlineDataSets=newArrayList<>();

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

privateListtimeList=newArrayList<>();//存储x轴的时间

//一条曲线

publicDynamicLineChartManager(LineChart mLineChart, String name,intcolor) {

this.lineChart= mLineChart;

leftAxis=lineChart.getAxisLeft();

rightAxis=lineChart.getAxisRight();

xAxis=lineChart.getXAxis();

initLineChart();

initLineDataSet(name, color);

}

//多条曲线

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);

//折线图例 标签 设置

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轴设置显示位置在底部

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开始,不然会上移一点

leftAxis.setAxisMinimum(0f);

rightAxis.setAxisMinimum(0f);

}

/**

* 初始化折线(一条线)

*

*@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);

//设置曲线填充

lineDataSet.setDrawFilled(false);

lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);

lineDataSet.setValueTextSize(10f);

lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);

//添加一个空的 LineData

lineData=newLineData();

lineChart.setData(lineData);

lineChart.invalidate();

}

/**

* 初始化折线(多条线)

*

*@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);

}

//添加一个空的 LineData

lineData=newLineData();

lineChart.setData(lineData);

lineChart.invalidate();

}

/**

* 动态添加数据(一条折线图,单个数据添加)

*

*@param number

*/

public voidaddEntry(intnumber) {

//最开始的时候才添加 lineDataSet(一个lineDataSet 代表一条线)

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

lineData.addDataSet(lineDataSet);

}

lineChart.setData(lineData);

//避免集合数据过多,及时清空(做这样的处理,并不知道有没有用,但还是这样做了)

if(timeList.size() >11) {

timeList.clear();

}

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

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

lineData.addEntry(entry,0);

//通知数据已经改变

lineData.notifyDataChanged();

lineChart.notifyDataSetChanged();

//设置在曲线图中显示的最大数量

lineChart.setVisibleXRangeMaximum(10);

//移到某个位置

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

}

/**

* 动态添加数据(一条条折线图,多个数据添加)

*@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);

}

/**

* 设置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();

}

/**

* 设置高限制线

*

*@paramhigh

*@paramname

*/

public voidsetHightLimitLine(floathigh, String name,intcolor) {

if(name ==null) {

name ="高限制线";

}

LimitLine hightLimit =newLimitLine(high, name);

hightLimit.setLineWidth(4f);

hightLimit.setTextSize(10f);

hightLimit.setLineColor(color);

hightLimit.setTextColor(color);

leftAxis.addLimitLine(hightLimit);

lineChart.invalidate();

}

/**

* 设置低限制线

*

*@paramlow

*@paramname

*/

public voidsetLowLimitLine(intlow, String name) {

if(name ==null) {

name ="低限制线";

}

LimitLine hightLimit =newLimitLine(low, name);

hightLimit.setLineWidth(4f);

hightLimit.setTextSize(10f);

leftAxis.addLimitLine(hightLimit);

lineChart.invalidate();

}

/**

* 设置描述信息

*

*@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);

//折线名称

names.add("测试");

//        names.add("测试二");

//        names.add("测试三");

//折线颜色

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);

//死循环添加数据

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();

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容