Android图表 MPAndroidChart折线图

2024-05-06 09:18

本文主要是介绍Android图表 MPAndroidChart折线图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.介绍

MPAndroidChart GitHub地址

Demo GitHub地址

MPAndroidChart的强大之处就不在多说了,目前最新的版本是3.0.1,在新版本中很多方法都被弃用了,这个要注意一下,在网上查到的大多数资料都是关于旧版本的,今天来实现一下折线图,把过程记录下来,分享给大家。

效果图:

折线图

2.引入开源库

  • 在项目根目录的build.gradle文件中加入如下代码
allprojects {repositories {maven { url "https://jitpack.io" }}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 在app根目录的buil.gradle文件中加入依赖
dependencies {compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
}
  • 1
  • 2
  • 3

3.实现

在项目中,我把图表相关的功能抽取成了一个工具类ChartUtils。

初始化图表

initChart方法用来设置图表的功能和显示的样式,方法中注释了缩放和动画的代码,如果要使用动画,则不需要调用图表的invalidate方法。

/*** 初始化图表** @param chart 原始图表* @return 初始化后的图表*/
public static LineChart initChart(LineChart chart) {// 不显示数据描述chart.getDescription().setEnabled(false);// 没有数据的时候,显示“暂无数据”chart.setNoDataText("暂无数据");// 不显示表格颜色chart.setDrawGridBackground(false);// 不可以缩放chart.setScaleEnabled(false);// 不显示y轴右边的值chart.getAxisRight().setEnabled(false);// 不显示图例Legend legend = chart.getLegend();legend.setEnabled(false);// 向左偏移15dp,抵消y轴向右偏移的30dpchart.setExtraLeftOffset(-15);XAxis xAxis = chart.getXAxis();// 不显示x轴xAxis.setDrawAxisLine(false);// 设置x轴数据的位置xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);xAxis.setTextColor(Color.WHITE);xAxis.setTextSize(12);xAxis.setGridColor(Color.parseColor("#30FFFFFF"));// 设置x轴数据偏移量xAxis.setYOffset(-12);YAxis yAxis = chart.getAxisLeft();// 不显示y轴yAxis.setDrawAxisLine(false);// 设置y轴数据的位置yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);// 不从y轴发出横向直线yAxis.setDrawGridLines(false);yAxis.setTextColor(Color.WHITE);yAxis.setTextSize(12);// 设置y轴数据偏移量yAxis.setXOffset(30);yAxis.setYOffset(-3);yAxis.setAxisMinimum(0);//Matrix matrix = new Matrix();// x轴缩放1.5倍//matrix.postScale(1.5f, 1f);// 在图表动画显示之前进行缩放//chart.getViewPortHandler().refresh(matrix, chart, false);// x轴执行动画//chart.animateX(2000);chart.invalidate();return chart;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

设置图表数据

setChartData方法用来设置图表显示的数据,以及折线的属性。

/*** 设置图表数据** @param chart  图表* @param values 数据*/
public static void setChartData(LineChart chart, List<Entry> values) {LineDataSet lineDataSet;if (chart.getData() != null && chart.getData().getDataSetCount() > 0) {lineDataSet = (LineDataSet) chart.getData().getDataSetByIndex(0);lineDataSet.setValues(values);chart.getData().notifyDataChanged();chart.notifyDataSetChanged();} else {lineDataSet = new LineDataSet(values, "");// 设置曲线颜色lineDataSet.setColor(Color.parseColor("#FFFFFF"));// 设置平滑曲线lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);// 不显示坐标点的小圆点lineDataSet.setDrawCircles(false);// 不显示坐标点的数据lineDataSet.setDrawValues(false);// 不显示定位线lineDataSet.setHighlightEnabled(false);LineData data = new LineData(lineDataSet);chart.setData(data);chart.invalidate();}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

更新图表

notifyDataSetChanged方法用来更新图表,可以动态的显示x轴标签。

/*** 更新图表** @param chart     图表* @param values    数据* @param valueType 数据类型*/
public static void notifyDataSetChanged(LineChart chart, List<Entry> values,final int valueType) {chart.getXAxis().setValueFormatter(new IAxisValueFormatter() {@Overridepublic String getFormattedValue(float value, AxisBase axis) {return xValuesProcess(valueType)[(int) value];}});chart.invalidate();setChartData(chart, values);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

x轴数据处理

xValuesProcess方法用于处理x轴数据。 
x轴可以显示三种类型的数据,分别是今日数据、本周数据、本月数据。

/*** x轴数据处理** @param valueType 数据类型* @return x轴数据*/
private static String[] xValuesProcess(int valueType) {String[] week = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};if (valueType == dayValue) { // 今日String[] dayValues = new String[7];long currentTime = System.currentTimeMillis();for (int i = 6; i >= 0; i--) {dayValues[i] = TimeUtils.dateToString(currentTime, TimeUtils.dateFormat_day);currentTime -= (3 * 60 * 60 * 1000);}return dayValues;} else if (valueType == weekValue) { // 本周String[] weekValues = new String[7];Calendar calendar = Calendar.getInstance();int currentWeek = calendar.get(Calendar.DAY_OF_WEEK);for (int i = 6; i >= 0; i--) {weekValues[i] = week[currentWeek - 1];if (currentWeek == 1) {currentWeek = 7;} else {currentWeek -= 1;}}return weekValues;} else if (valueType == monthValue) { // 本月String[] monthValues = new String[7];long currentTime = System.currentTimeMillis();for (int i = 6; i >= 0; i--) {monthValues[i] = TimeUtils.dateToString(currentTime, TimeUtils.dateFormat_month);currentTime -= (4 * 24 * 60 * 60 * 1000);}return monthValues;}return new String[]{};
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在Activity中使用

ChartUtils.initChart(chart);
ChartUtils.notifyDataSetChanged(chart, getData(), ChartUtils.dayValue);
  • 1
  • 2

布局文件

<com.github.mikephil.charting.charts.LineChartandroid:id="@+id/chart"android:layout_width="match_parent"android:layout_height="match_parent" />
  • 1
  • 2
  • 3
  • 4

4.遇到的问题

  • 在设置x轴水平方向平移时,xAxis.setXOffset()方法不起作用,这让我研究了好长时间,最后无奈使用图表平移方法chart.setExtraLeftOffset()来抵消y轴的平移,已经提交到了Issues上,有解答会在博客中更新。

  • 目前y轴数据只能通过设置最大值、最小值、显示个数的方式来显示数据(如果不设置会自动计算),还没有找到自定义显示数据的方法,有了解的小伙伴可以留言告诉我啊。

  • 自定义x轴数据的时候记得要算好对应的值,Demo中只用到了7个点,所以比较简单,但是x轴数据比较多的话,就要算一下了,如果有不懂的地方可以给我留言或者发私信。

5.写在最后

在实现的过程中,MPAndroidChart的Issues帮了不少忙,有很多人和我遇到了同样的问题,原来没有查阅Issues的习惯,又get新技能一枚。

官方文档

完整的Demo下载

Demo GitHub地址

这篇关于Android图表 MPAndroidChart折线图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/963985

相关文章

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级