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实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。