折线图表android,Android 折线图表MPAndroidChart的实现

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

7b71f5dcfeb15e9fc592d16b4151b59e.png single.png

c99bb227ce8d75a0a221e99f4877a0c1.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()方法进行添加的。

补充:

图例,也就是这玩意

1c3874e608fbeeda547dc63cbf041cfa.png 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,后续会有更多更好的博客推送给您。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我最喜欢的Java高级开发人员书籍

我上一篇博客文章 &#xff08;我对高级Java开发人员的十个最喜欢的在线资源&#xff09;的想法是由Xiaoran Wang发表的针对高级Java开发人员的十大网站的启发。 Wang还写了一篇名为《面向Java高级开发人员的十大书籍》的文章。 正如关于高级Java开发人员的最佳网站上的帖子一样…

pyplot绘制图片_matplotlib系列之pyplot

pyplot对象包含了一系列用于绘图的函数&#xff0c;使得它工作起来就像MATLIB一样。它的功能例如&#xff1a;创建一个figure对象绘制一片绘图区域在区域中绘制线条或者点也可以绘制labels使用pyplot对象快速的生成一幅图片import matplotlib.pyplot as pltplt.subplot(121)plt…

字符串-----KMP竟然是18禁

今天学了一下午字符串&#xff0c;讲到结束也没讲KMP。有人问老师为什么不讲&#xff0c;老师来一句&#xff1a;字符串noip不考&#xff0c;而且还是18禁&#xff0c;自然不讲。【手动滑稽】 所以我也不讲。【微笑】 1.表达式树 表示35*8 最后计算的符号是根节点&#xff0c;是…

里bl2和bl3为什么分开_英国的水池为什么有两个水龙头?为什么英国有独立的冷热水龙头?...

如果大家看过我之前的文章&#xff0c;可能会有点映像&#xff0c;前面有提到过英国的双水龙头&#xff0c;有兴趣的朋友们可以点后面的直达链接查看&#xff1a;为什么在英国留学会掉头发&#xff1f;怎么办&#xff1f;英国的自来水&#xff08;冷水&#xff09;可以直接喝吗…

三剑客 老大:awk命令用法

awk是一种编程语言&#xff0c;用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一 个或多个文件&#xff0c;或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能&#xff0c;是linux/unix下的一个强大编程工具。它在命令行中使用&…

Mockito –带有注释和静态方法的额外接口

在代码中&#xff0c;我最近遇到了一段非常糟糕的代码&#xff0c;这些代码基于对对象执行某些操作的类转换。 当然&#xff0c;代码需要重构&#xff0c;但是如果您首先没有对该功能进行单元测试&#xff0c;则有时您可能无法做到/或者不想这样做&#xff08;这应该是可以理解…

怎么把原来的墙拆掉_家装拆除不是简单的砸砸墙,它也是有技术的

装修拆除中有很多人认为&#xff0c;拆除施工没有什么技术含量&#xff0c;感觉就像小品演的那样&#xff0c;挥挥大锤砸砸墙就可以了。所以有的人图便宜就从马路上随便找的工人来砸墙&#xff0c;他们不管是不是承重墙&#xff0c;只要业主要求他们就敢咋&#xff0c;后果真有…

20180209-os模块

下面将学习关于os模块的相关操作 项目练习的目录结构如下&#xff1a;所有的操作都是基于os_exercise.py模块 1.获取当前的Python脚本的工作目录路径 os.getcwd() # 1.获取当前目录 dir os.getcwd() print(获取当前python脚本工作目录:,dir) # 输出 # 获取当前python脚本工作目…

关于IE6.7.8.FF兼容的问题

所有浏览器 通用 height: 100px; IE6 专用 _height: 100px;IE6 专用 *height: 100px; IE7 专用 * height: 100px; IE7、FF 共用 height: 100px !important; 一、CSS 兼容 以下两种方法几乎能解决现今所有兼容. 1, !important (不是很推荐&#xff0c;用下面的一种感觉最安…

冯珊珊_模拟器企业衡泰信签约冯珊珊,推动高尔夫运动下沉

9月21日&#xff0c;著名高尔夫模拟器企业衡泰信宣布签约中国高尔夫球员冯珊珊&#xff0c;双方正式达成全面战略合作&#xff0c;旨在共同推动室内高尔夫运动的普及与推广&#xff0c;让更多人参与并喜爱上这项运动&#xff0c;推动全民健身目标&#xff0c;借助互联网、智慧场…

CSS3之background的调整和增加的属性

对于background做了一些修改&#xff0c;最明显的一个就是采用设置多背景&#xff0c;不但添加了4个新属性&#xff0c;并且还对目前的属性进行了调整增强。 1、多个背景图片 在css3里面&#xff0c;你可以再一个标签元素里应用多个背景图片。代码类似与css2.0版本的写法&…

html 天气特效,用CSS制作天气特效动画,源码分享

效果图今天给大家带来的是CSS3动画天气图标代码&#xff0c;简单实用好看&#xff01;CSS源码&#xff1a;html { box-sizing: border-box; }html *,html *:before,html *:after { box-sizing: inherit; }body {max-width: 42em;padding: 2em;margin: 0 auto;color: #161616;fo…

做折线图坐标轴数字_Excel折线图表的另类表达制作?牛闪君使用了双线表达法来完成...

牛闪闪办公第846个原创技巧Zloffice社群的小伙伴还是很爱学习的&#xff0c;这不&#xff0c;有一位小伙伴看到“特殊”图表表达&#xff0c;想知道是怎么做出来的。这种学习的思路非常好&#xff0c;看到好的表达就想学习&#xff0c;这是非常好的收集习惯&#xff0c;能够积累…

Spring MVC:表单处理卷。 5 –选择,选项,选项标签

下拉列表是Web表单中最常见的元素之一。 在HTML中&#xff0c;可以使用适当的标签创建此类控件&#xff1a; <form&#xff1a;select> –下拉列表的父标签和<form&#xff1a;option> – <form&#xff1a;select>标签的子标签。 Spring MVC标签库为下拉列表…

Python的看门狗实现自动化实时对服务器、Windows或Linux文件夹的实时监控

众所周知&#xff0c;在运维过程中&#xff0c;实时获取目标文件夹至关重要&#xff0c;Python的watchdog是用程序来监视文件系统事件Python库&#xff0c;所以用该库可以实现对文件夹的实时监控&#xff0c;filenotify.py代码如下&#xff1a; # -*- coding: utf-8 -*- #!/usr…

在html中样式表的三种类型,css样式有哪几种类型?

CSS样式可以写在哪些地方呢&#xff1f;从CSS 样式代码插入的形式来看基本可以分为以下3种&#xff1a;内联式、嵌入式和外部式三种。下面本篇文章就来给大家介绍一下CSS样式的类型&#xff0c;希望对大家有所帮助。内联式样式内联式css样式表就是把css代码直接写在现有的HTML标…

记录合规性–关于TCK,规格和测试

使用软件规格非常困难。 不论在哪个地方提出&#xff1b; 您最终遇到了一个大问题&#xff1a;是否已实施并测试了所有指定的内容&#xff1f; 在瀑布驱动的方法学时代&#xff0c;这一直是一个问题&#xff0c;即使在撰写本文的今天&#xff0c;敏捷性和用户故事仍然不能保证您…

arcgis已试图对空几何执行该操作_ArcGIS中地理配准与空间校正的不同

ArcGIS中地理配准与空间校正都是用于数据坐标变换的目的&#xff0c;他们之间有什么区别呢&#xff1f;1、处理对象不同&#xff1a;地理配准针对栅格数据&#xff0c;而空间校正针对矢量数据。因此空间校正需要建立在矢量数据编辑的基础上&#xff0c;空间校正之前应开始编辑。…

【计算机视觉】深度学习视觉领域常用数据集汇总

本文结合笔者在研究生学习、科研期间使用过以及阅读文献了解到的深度学习视觉领域常用的开源数据集&#xff0c;进行介绍和汇总。MNIST深度学习领域的“Hello World!”&#xff0c;入门必备&#xff01;MNIST是一个手写数字数据库&#xff0c;它有60000个训练样本集和10000个测…

JavaScript高级特征之面向对象笔记

Javascript面向对象&#xff1a;函数&#xff1a; * Arguments对象&#xff1a; * Arguments对象是数组对象 * Arguments对象的length属性可以获取参数的个数 * 利用Arguments对象模拟函数的重载效果&#xff08;javascript中不存在函…