昨日夜观天象,今日忽见北斗星陨落,《Android 折线图表》应运而生。

single.png

many.png

一.本篇采用MPAndroidChart,大体实现步骤可分为两步:

1.配置基本属性(包括X,Y轴)

2.设置折线数据并添加

复制代码

二. 第一步,配置基本属性。

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);//设置图表内格子背景是否显示,默认是false

lineChart.setHighlightPerDragEnabled(true);//能否拖拽高亮线(数据点与坐标的提示线),默认是true

lineChart.setBackgroundColor(Color.WHITE); //设置背景颜色

//配置X轴属性

xAxis = lineChart.getXAxis();

//xAxis.setLabelRotationAngle(25f); //设置旋转偏移量

xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //设置X轴的位置

//设置标签文本格式

xAxis.setTextSize(10f);

//设置标签文本颜色

xAxis.setTextColor(Color.rgb(255, 192, 56));

//是否绘制轴线

xAxis.setDrawAxisLine(true);

//是否绘制网格线

xAxis.setDrawGridLines(false);

//设置是否一个格子显示一条数据,如果不设置这个属性,就会导致X轴数据重复并且错乱的问题

xAxis.setGranularity(1f);

//配置Y轴信息

leftAxis = lineChart.getAxisLeft();

leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART); //设置Y轴的位置

leftAxis.setDrawGridLines(true); //设置左边的网格线显示

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); //因为自带的图例太丑,而且操作也不方便,楼主选择自定义,设置不显示比例图

}

复制代码

第二步,设置折线数据。

首先,自定义我们的X轴适配器:

public class MyXFormatter implements IAxisValueFormatter {

private List list;

public MyXFormatter(List 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

return list.get((int) (value));

}else {

return null;

}

}

}

复制代码

然后,设置折线数据。单条折线的数据方法设置如下:

/**

* 设置单条折线的数据

* count 单条折线的数据量

*/

private void setSingleDatas(int count) {

//设置单条折线的X轴数据

singleNameList = new ArrayList<>();

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

int j = i+1;

singleNameList.add(j + "月");

}

//将X轴数据传入自定义的X轴ValueFormatter

MyXFormatter formatter = new MyXFormatter(singleNameList);

xAxis.setValueFormatter(formatter);

//设置单条折现的Y轴数据

ArrayList yList = new ArrayList();

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 dataSets = new ArrayList<>();

//设置折线的属性

lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT); //设置左右两边Y轴节点描述

lineDataSet.setValueTextColor(ColorTemplate.getHoloBlue()); //设置节点文字颜色

lineDataSet.setDrawCircles(false); //设置是否显示节点的小圆点

lineDataSet.setDrawValues(false); //设置是否显示节点的值

lineDataSet.setHighLightColor(Color.rgb(244, 117, 117));//当点击节点时,将会出现与节点水平和垂直的两条线,可以对其进行定制.此方法为设置线条颜色

lineDataSet.setHighlightEnabled(true);//设置是否显示十字线

lineDataSet.setColor(Color.BLUE); //设置线条颜色

lineDataSet.setCircleColor(Color.WHITE); //设置节点的圆圈颜色

lineDataSet.setLineWidth(1f); //设置线条宽度

lineDataSet.setCircleRadius(4f);//设置每个坐标点的圆大小

lineDataSet.setDrawCircleHole(false);//是否定制节点圆心的颜色,若为false,则节点为单一的同色点,若为true则可以设置节点圆心的颜色

lineDataSet.setValueTextSize(9f); //设置 DataSets 数据对象包含的数据的值文本的大小(单位是dp)。

//设置折线图填充

lineDataSet.setDrawFilled(false); //Fill填充,可以将折线图以下部分用颜色填满

lineDataSet.setFillAlpha(65); 设置填充区域透明度,默认值为85

lineDataSet.setFillColor(ColorTemplate.getHoloBlue());//设置填充颜色

lineDataSet.setFormLineWidth(1f);

lineDataSet.setFormSize(15.f);

dataSets.add(lineDataSet);

LineData data = new LineData(dataSets);

lineChart.setData(data); //添加数据

}

复制代码

多条折线的数据设置方法如下:

/**

* 设置多条折线的数据

* @param chartData //线条x轴的个数

* @param count //线条的个数

*/

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 dataSets = new ArrayList<>(); //线条数据集合

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

//设置单条折现的Y轴数据

ArrayList yList = new ArrayList();

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轴节点描述

lineDataSet.setValueTextColor(ColorTemplate.getHoloBlue()); //设置节点文字颜色

lineDataSet.setDrawCircles(false); //设置是否显示节点的小圆点

lineDataSet.setDrawValues(false); //设置是否显示节点的值

lineDataSet.setHighLightColor(Color.rgb(244, 117, 117));//当点击节点时,将会出现与节点水平和垂直的两条线,可以对其进行定制.此方法为设置线条颜色

lineDataSet.setHighlightEnabled(true);//设置是否显示十字线

lineDataSet.setColor(colours.get(i)); //设置线条颜色

lineDataSet.setCircleColor(Color.WHITE); //设置节点的圆圈颜色

lineDataSet.setLineWidth(1f); //设置线条宽度

lineDataSet.setCircleRadius(4f);//设置每个坐标点的圆大小

lineDataSet.setDrawCircleHole(false);//是否定制节点圆心的颜色,若为false,则节点为单一的同色点,若为true则可以设置节点圆心的颜色

lineDataSet.setValueTextSize(9f); //设置 DataSets 数据对象包含的数据的值文本的大小(单位是dp)。

//设置折线图填充

lineDataSet.setDrawFilled(false); //Fill填充,可以将折线图以下部分用颜色填满

lineDataSet.setFillAlpha(65); 设置填充区域透明度,默认值为85

lineDataSet.setFillColor(ColorTemplate.getHoloBlue());//设置填充颜色

lineDataSet.setFormLineWidth(1f);

lineDataSet.setFormSize(15.f);

dataSets.add(lineDataSet);

}

LineData data = new LineData(dataSets);

lineChart.setData(data); //添加数据

}

/**

* 设置线条名字集合

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

}

复制代码

由上代码,相信看官老爷们不难看出,单条折线和多条折线的实现思路其实有异曲同工之妙。都是创建了一个ArrayList集合,添加LineDataSet 对象并设置属性。最后将此集合通过LineData的构造方法,调用图表对象的.setData()方法进行添加的。

补充:

图例,也就是这玩意

image.png

最好自己定义,写个GirdView就可以了。还能自动换行,美滋滋。官方的不多说,丑而且自动换行有问题。

三.踩坑之处:

1.自定义X轴数据。 这里有一个不得不说的要点,我们在自定义X轴数据,创建自己的IAxisValueFormatter实现类时,一定要注意提前设置 X轴的这个属性:

//设置是否一个格子显示一条数据

xAxis.setGranularity(1f);

复制代码

如果不设置这个属性,就会导致X轴数据重复并且错乱,原因是IAxisValueFormatter实现类的的方法getFormattedValue(float value, AxisBase axis)中的value返回错乱。

2.数据刷新。

如果你实现了自己的图表控件,并且有多种类型的数据需要重复设置,需要刷新图表控件时,若有X轴经常显示错乱的问题,不妨多调用一次lineChart.setData(data);方法。

四.到此,就已经实现了折线图表的功能。随手分享,喜欢的朋友可以关注微信公众号MiHomes,后续会有更多更好的博客推送给您。

另:欢迎指出不足,会进行更正

折线图表android,Android 折线图表MPAndroidChart的实现相关推荐

  1. android 大屏图表 MPAndroidChart 折线图 曲线图 柱状图 圆角柱状图 条形图

    //图表库implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' X轴:XAxis Y轴:YAxis 图例:Legend 描述:Descri ...

  2. Android开源框架——图表MPAndroidChart

    开源官网:https://github.com/PhilJay/MPAndroidChart Android开源框架--图表MPAndroidChart 特点 配置 图表类型 Demo MPAndro ...

  3. Android之玩转MPAndroidChart让(折线图、柱形图、饼状图、散列图、雷达图)优雅的舞动

    第一步:不废话,先爆照 我的github地址:https://github.com/changechenyu/MPAndroidChartTest 第二步:介绍MPAndroidChart适用场景并把 ...

  4. android 大屏图表 MPAndroidChart 饼状图 饼图,圆形统计图

    //图表库implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' X轴:XAxis Y轴:YAxis 图例:Legend 描述:Descri ...

  5. Android强大的图表开源——MPAndroidChart

    介绍 在APP开发中遇到图表的样式,一般我们要先查询GitHub上比较火的开源框架,这种图标应用广泛,统计.游戏统计.人际关系图等等,用到今天的这个框架MPAndroidChart 点击查看GitHu ...

  6. Android之玩转MPAndroidChart让(折线图、柱形图、饼状图、散... http://www.apkbus.com/thread-267832-1-1.html)...

    Android之玩转MPAndroidChart让(折线图.柱形图.饼状图.散... http://www.apkbus.com/thread-267832-1-1.html) 转载于:https:/ ...

  7. 最牛逼android上的图表库MpChart(一) 介绍篇

    最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...

  8. 新手如何画出自定义View(Android——自定义折线图)

    在正式开始之前 我还是打算先说几句废话: 1.本文章是让初学者画自定义View所以不会对代码进行过多的解释 2.为什么不用现有强大的图表框架 列如:Android HelloChart 或者 MPAn ...

  9. Android studio 可视化图表制作

    Android studio 图表实现,和动态更新 今天做客户端的时候,客户有个我没做过的需求 要实现界面有个曲线图,随着下位机传递的数据更新图表,过于老的数据需要剔除,曲线跟着移动,网上找到个宝藏库 ...

最新文章

  1. javascript数组降维_Javascript实现的数组降维——维度不同,怎么谈恋爱
  2. Spring IOC注入Map接口小技巧
  3. JavaWeb学习之路——SpringBoot 中thymeleaf模板用法(三)
  4. SQL Relay 0.49 发布,SQL 中间层
  5. SAP License:O2O模式的衡量标准是什么?
  6. 金九银十正确打开方式!那些年我们一起踩过算法与数据结构的坑
  7. SpringMVC+uploadify3.2.1版实现附件上传功能(直接可以使用)
  8. ArcMap DayDreamInGIS数据处理工具 插件之 搜狗词库生成
  9. 自然辩证法概论国科大开卷考试
  10. 模拟人生Java修改_模拟人生4 常用修改秘籍作弊码一览 修改秘籍怎么用
  11. noi acm topcoder
  12. gofpdf 学习笔记
  13. ①变量、常量、数据类型解释 ②标识符命原则 ③sizeof使用原则 ④float型科学计数法 ⑤字符转换到ASCII表 ⑥\t 的使用意义【黑马程序员视频】
  14. 东华考研复试21-30oj
  15. 看完这篇电磁兼容分层与综合设计法,EMC你还不懂就没救了
  16. 优化了的过关键点的光滑曲线拟合算法
  17. Audacity如何改变音频节奏?Audacity调整音频节奏方法
  18. Debian搭建ftp服务并使用虚拟账户登录
  19. 根据word模板(书签)创建导出word
  20. wlacm一笔画问题(图的遍历) 题解

热门文章

  1. vivox7刷linux系统,Vivo 找来宋仲基帮你送 X7
  2. mysql or优化_MySQL 语句优化
  3. 计算机操作员实操高级试题,计算机操作员高级实操(以往考过,可做平时练习素材)答题.doc...
  4. 机器学习算法应用30篇(一)-支持向量机(SVM)理论与实践
  5. jsp里面编写java代码注意加双引号
  6. 2011年计算机二级试题,2011年3月全国计算机二级C++考试真题
  7. vs2015 html页面没有试图,vs2015 web设计视图假死,求帮助
  8. java枚举的特点_Java中有些好的特性(二):枚举
  9. 【完成发布】Lazy Line Painter – 非常有趣的 jQuery 路径动画插件
  10. 在vue中使用SockJS实现webSocket通信