在开发当中曲线图用的时候太多了,之前都是自己手写,之后发现太累还丑不符合需求

MPAndroidChart

先介绍LineChart

0.效果图

首先依赖  1. implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'

2.xml布局

<com.github.mikephil.charting.charts.LineChart
android:id="@+id/multi_line_Gl_chart"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginStart="17.5dp" />

3.逻辑代码

我这里的需求是获取24小时电量,不允许滑动缩放,X 24小时轴是只显示偶数

Y轴数据精确到小数点两位,Y轴最大值为获取数据集合最大值,最大值小于1的时候最大值进1加0.1。大于1的时候最大值增加20%。。。。大概就是这样        //左图具有描述设置,默认有描述,我这里是之前有这个需求现在没啦

最后的最后我这个是双曲线,至于单曲线或者多个曲线,增加删除就可以


Description description = new Description();
description.setText("");
description.setTextAlign(Paint.Align.CENTER);
description.setTextSize(16);
description.setPosition(200, 150);
description.setTextColor(ContextCompat.getColor(this, android.R.color.holo_blue_bright));
multiLineGlChart.setDescription(description); multiLineGlChart.setHighlightPerTapEnabled(false);//隐藏图表内的点击十字线
multiLineGlChart.setHighlightPerDragEnabled(false); //设置是否后台绘制
multiLineGlChart.setDrawGridBackground(false);
//设置支持触控手势
multiLineGlChart.setTouchEnabled(false);
//设置缩放
multiLineGlChart.setDragEnabled(true);
//设置推动
multiLineGlChart.setScaleEnabled(false);
//如果禁用,扩展可以在x轴和y轴分别完成
multiLineGlChart.setPinchZoom(false);
Matrix m = new Matrix();
m.postScale(1, 1f);//两个参数分别是x,y轴的缩放比例。例如:将x轴的数据放大为之前的1.5倍,《这个地方是在设置能滑动的时候编辑的,假如X轴最多展示5条但是呢有10条数据,那么这里就是2,1》
multiLineGlChart.getViewPortHandler().refresh(m, multiLineGlChart, true);//将图表动画显示之前进行缩放
multiLineGlChart.animateX(1000); // 动画,x轴 //设置图例
Legend legend = multiLineGlChart.getLegend();
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);//设置显示在顶部
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);//设置图例的显示位置为居中
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);//设置图例显示的布局为横线排列
legend.setTextSize(10f);//设置图例文本的字体大小,根据界面显示自行调配
//配置X轴
XAxis xAxis = multiLineGlChart.getXAxis();
xAxis.setAxisMinimum(0);//X轴最大值最小值,
xAxis.setGranularity(1);//设置X轴每个点之间数据的间隔
xAxis.setLabelCount(5, false);//设置标签个数
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //设置x标签显示的在底部
xAxis.setDrawGridLines(false);//不画X轴网格线
xAxis.setDrawAxisLine(false);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {//switch是当知道X轴有多少个的时候,下一个是不知道X轴数据数量的情况
switch (index) {
case 1:
label = "00";
break;
case 2:
label = "";
break;
case 3:
label = "02";
break;
case 4:
label = "";
break;
case 5:
label = "04";
break;
case 6:
label = "";
break;
case 7:
label = "06";
break;
case 8:
label = "";
break;
case 9:
label = "08";
break;
case 10:
label = "";
break;
case 11:
label = "10";
break;
case 12:
label = "";
break;
case 13:
label = "12";
break;
case 14:
label = "";
break;
case 15:
label = "14";
break;
case 16:
label = "";
break;
case 17:
label = "16";
break;
case 18:
label = "";
break;
case 19:
label = "18";
break;
case 20:
label = "";
break;
case 21:
label = "20";
break;
case 22:
label = "";
break;
case 23:
label = "22";
break;
case 24:
label = "";
break;
case 25:
label = "24";
break;
default:
label = "";
break;
}
int index = (int) value;
if (value==time.size()&&(int) value % time.size()==0){//假如没有这个if会造成的后果是,当数据为40条的时候会出现最后一条数据取得值是第一条数据,so
String tradeDate = time.get(time.size()-1).substring(11,16);
return tradeDate;
}else{
String tradeDate = time.get((int) value % time.size()).substring(11,16);
return tradeDate;
} }
});
xAxis.setTextColor(ContextCompat.getColor(this, R.color.text_color));//设置标签的文本颜色
YAxis axisRight = multiLineGlChart.getAxisRight();
axisRight.removeAllLimitLines();
axisRight.setDrawAxisLine(false);//设置不画左边线的第一条线
axisRight.setDrawGridLines(true);
YAxis leftAxis = multiLineGlChart.getAxisLeft();
leftAxis.removeAllLimitLines();
leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
List<Double> list=new ArrayList<>();//以下的代码是最大值的设置,个人最大值设置方法,也是需求,so,可以自己更改
for (int i = 0; i < last.size(); i++) {
try {
list.add(Double.valueOf(last.get(i)));
} catch (NumberFormatException e) {
e.printStackTrace();
}
} double max = Collections.max(list)/1000;
double min = Collections.min(list); List<Double> listNow=new ArrayList<>();
for (int i = 0; i < now.size(); i++) {
try {
listNow.add(Double.valueOf(now.get(i).replaceAll("\\-","0")));
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
double minNow = Collections.min(listNow);
double maxNow = Collections.max(listNow)/1000; if (max>maxNow){
// leftAxis.setAxisMaximum((float)Math.ceil(max*1.2));//设置最大值
if (max>1){
leftAxis.setAxisMaximum((float) Math.ceil(max*1.2));//设置最大值
}else{
leftAxis.setAxisMaximum((float) (max+0.1));//设置最大值
}
}else{
// leftAxis.setAxisMaximum((float) Math.ceil(maxNow*1.2));//设置最大值
if (maxNow>1){
leftAxis.setAxisMaximum((float) Math.ceil(maxNow*1.2));//设置最大值
}else{
leftAxis.setAxisMaximum((float) (maxNow+0.1));//设置最大值
}
}
leftAxis.setAxisMinimum(0f);//设置最小值
leftAxis.setLabelCount(4,true);//设置标签的个数
leftAxis.setDrawAxisLine(false);//设置不画左边线的第一条线 //设置坐标轴标签文字样式
leftAxis.setTypeface(Typeface.DEFAULT_BOLD);
//设置此轴网格线颜色
leftAxis.setGridColor(Color.parseColor("#1A00CAE3"));
//设置此轴网格线宽度
leftAxis.setGridLineWidth(0.5f);
//设置坐标轴的颜色
leftAxis.setAxisLineColor(Color.parseColor("#1A00CAE3"));
//设置坐标轴的宽度
leftAxis.setAxisLineWidth(1f);
//使用虚线组成的网格线
//参数:linelength:虚线长度
// spacelength:虚线间隔长度
// phase:虚线出发点(从第一根虚线的哪里出发)
leftAxis.enableGridDashedLine(5f, 10f, 20f); leftAxis.setDrawGridLines(true); //自定义标签显示
leftAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
// int val = (int) value;//这里是设置是否是显示成小数或者整数
String val;
DecimalFormat df = new DecimalFormat("#0.00");
val = df.format(value);
return val + ""; }
});
//设置标签文本颜色
leftAxis.setTextColor(ContextCompat.getColor(this, R.color.text_color)); multiLineGlChart.getAxisRight().setEnabled(false);//设置右侧Y轴不显示 //第二条线
List<Entry> values2 = new ArrayList<>(); //
for (int i = 0; i < now.size(); i++) {
// values2.add(new Entry((i+1), 120));
// values2.add(new Entry((i+1), (Float.valueOf(String.valueOf(now.get(i))))/1000));
values2.add(new BarEntry((i + 1),(Float.valueOf(String.valueOf(now.get(i))))/1000));
} LineDataSet lineDataSet2 = new LineDataSet(values2, "");
/*
LINEAR,直线
STEPPED,
CUBIC_BEZIER,
HORIZONTAL_BEZIER
*/
lineDataSet2.setMode(LineDataSet.Mode.CUBIC_BEZIER);//设置折线图的显示模式,可以自行设置上面的值进行查看不同之处
lineDataSet2.setColor(ContextCompat.getColor(this, R.color.color29ca5a));//设置线的颜色
lineDataSet2.setLineWidth(1.5f);//设置线的宽度
lineDataSet2.setDrawCircles(false);
lineDataSet2.setDrawCircleHole(false);
lineDataSet2.setAxisDependency(YAxis.AxisDependency.LEFT);//设置线数据依赖于左侧y轴
lineDataSet2.setDrawFilled(false);//设置不画数据覆盖的阴影层
lineDataSet2.setDrawValues(false);//不绘制线的数据
lineDataSet2.setValueTextColor(ContextCompat.getColor(this, R.color.text_color));//设置数据的文本颜色,如果不绘制线的数据 这句代码也不用设置了
lineDataSet2.setValueTextSize(15f);//如果不绘制线的数据 这句代码也不用设置了
lineDataSet2.setCircleRadius(4f);//设置每个折线点的大小
lineDataSet2.setFormSize(0f);//设置当前这条线的图例的大小
lineDataSet2.setForm(Legend.LegendForm.CIRCLE);//设置图例显示为线
lineDataSet2.setValueFormatter(new IValueFormatter() {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
// int val = (int) value;
String val;
DecimalFormat df = new DecimalFormat("#0.00");
val = df.format(value);
return val + "";
}
}); //第三条线
List<Entry> values3 = new ArrayList<>();
for (int i = 0; i < last.size(); i++) {
// values3.add(new Entry((i+1), 110));
values3.add(new BarEntry((i + 1), (Float.valueOf(String.valueOf(last.get(i))))/1000));
} LineDataSet lineDataSet3 = new LineDataSet(values3, "");
/*
LINEAR,直线
STEPPED,
CUBIC_BEZIER,
HORIZONTAL_BEZIER
*/
lineDataSet3.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);//设置折线图的显示模式,可以自行设置上面的值进行查看不同之处
lineDataSet3.setColor(ContextCompat.getColor(this, R.color.colorFFC738));//设置线的颜色
lineDataSet3.setLineWidth(1.5f);//设置线的宽度
lineDataSet3.setDrawCircles(false); lineDataSet3.setDrawCircleHole(false);
lineDataSet3.setAxisDependency(YAxis.AxisDependency.LEFT);//设置线数据依赖于左侧y轴
lineDataSet3.setDrawFilled(false);//设置不画数据覆盖的阴影层
lineDataSet3.setDrawValues(false);//不绘制线的数据
lineDataSet3.setValueTextColor(ContextCompat.getColor(this, R.color.text_color));//设置数据的文本颜色,如果不绘制线的数据 这句代码也不用设置了
lineDataSet3.setValueTextSize(15f);//如果不绘制线的数据 这句代码也不用设置了
lineDataSet3.setCircleRadius(4f);//设置每个折线点的大小
lineDataSet3.setFormSize(0f);//设置当前这条线的图例的大小
lineDataSet3.setForm(Legend.LegendForm.CIRCLE);//设置图例显示为线
lineDataSet3.setValueFormatter(new IValueFormatter() {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
String val;
DecimalFormat df = new DecimalFormat("#0.00");
val = df.format(value);
return val + "";
}
}); //初始化一个LineDataSet集合来装每个线的数据
List<ILineDataSet> lineDataSetList = new ArrayList<>(); if (chbGlJr.isChecked() && chbGlZr.isChecked()) {
lineDataSetList.add(lineDataSet3);
lineDataSetList.add(lineDataSet2); } else if (chbGlJr.isChecked() && !chbGlZr.isChecked()) {
lineDataSetList.add(lineDataSet2);
} else if (!chbGlJr.isChecked() && chbGlZr.isChecked()) {
lineDataSetList.add(lineDataSet3);
} //将多条线的数据全部给LineData
LineData lineData = new LineData(lineDataSetList);
multiLineGlChart.setData(lineData); //默认动画
multiLineGlChart.animateXY(1000, 1000);

  


  

   日常许愿五星曹大爷刘大爷,祭品全服

Android详细介绍MPAndroidChart-LineChart的更多相关文章

  1. Android manifest之manifest标签详细介绍

    AndroidManifest详细介绍 本文主要对AndroidManifest.xml文件中各个标签进行说明.索引如下: 概要PART--01 manifest标签PART--02 安全机制和per ...

  2. 学习笔记:APP切图那点事儿–详细介绍android和ios平台

    学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html   版权归原作者所有 作者:亚茹有李 原文地址 ...

  3. Android Bitmap详细介绍(转)

    转自: Bitmap详细介绍 package com.testbitmapscale; import java.io.File; import java.io.FileInputStream; imp ...

  4. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  5. 详细介绍android rom移植知识普及

    详细介绍android rom移植知识普及 最近接到很多兄弟们的求助,也回答过无数个和下面这个问题类似的问题: 如何编译android 原生代码得到一个rom,然后跑到某某手机上. 鉴于很多兄弟对这块 ...

  6. android之ListView,详细介绍实现步骤,举例,自定义listview适配器

    android之ListView,详细介绍实现步骤,举例,自定义listview适配器 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listVie ...

  7. 如何获得Android设备名称(ADB命令详细介绍)

    豌豆荚.360手机管家等软件可以获取android设备名称,显示在界面上,如下图: 我们自己如何来获取设备名称 呢?答案如下: 在命令行中输入“adb shell”进入shell之后,再输入“cat ...

  8. Android 蓝牙开发(3)——蓝牙的详细介绍

    前面的两篇文章,主要是在 Android 官网关于蓝牙介绍的基础上加上自己的理解完成的.主要针对的是 Android 开发中的一些 API 的使用. 第一篇文章 Android 蓝牙开发(1) 主要是 ...

  9. Android自动化测试探索(一)adb详细介绍

    adb详细介绍 #1. 基本简介 adb,即Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具 #2. Mac上安装adb 安装brew /usr/bin/r ...

随机推荐

  1. Java实现 蓝桥杯VIP 算法提高 多项式输出

    算法提高 多项式输出 时间限制:1.0s 内存限制:512.0MB 问题描述 一元n 次多项式可用如下的表达式表示: f(x)=a[n]xn+a[n-1]x(n-1)+-+a[1]x+a[0], a[ ...

  2. java实现日程表

    [编程题] 某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息两天. 上级要求每个人每周的工作日和休息日必须是固定的,不能在周间变更. 此外,由于工作需要,还有如下要求: 1. 所有人的连 ...

  3. java实现第三届蓝桥杯古代赌局

    古代赌局 [编程题](满分23分) 俗话说:十赌九输.因为大多数赌局的背后都藏有阴谋.不过也不尽然,有些赌局背后藏有的是:"阳谋". 有一种赌局是这样的:桌子上放六个匣子,编号是1 ...

  4. java实现第七届蓝桥杯七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  5. thinkphp5升级thinkphp6完整步骤

    在php.ini文件中  打开  php_openssl扩展,去掉前面的;extension=php_openssl.dll 在phpstudy的WWW目录打开cmd,输入composer creat ...

  6. TensorFlow开发者证书 中文手册

    经过一个月的准备,终于通过了TensorFlow的开发者认证,由于官方的中文文档较少,为了方便大家了解这个考试,同时分享自己的备考经验,让大家少踩坑,我整理并制作了这个中文手册,请大家多多指正,有任何 ...

  7. Docker——基于Docker安装Drupal博客系统

    Docker--基于Docker安装Drupal博客系统 向脚本文件追加内容 cat << EOF > build.sh #设置主机名 hostnamectl set-hostnam ...

  8. [ARC101B]Median of Medians

    题目   点这里看题目. 分析   看到中位数,当然会想到二分答案.   考虑检查答案.自然,我们需要找出中位数小于二分值\(k\)的区间的个数.考虑构造一个\(b\): \[b_i=(-1)^{[a ...

  9. mysql explain的type的

    导语 很多情况下,有很多人用各种select语句查询到了他们想要的数据后,往往便以为工作圆满结束了.这些事情往往发生在一些学生亦或刚入职场但之前又没有很好数据库基础的小白身上,但所谓闻道有先后,只要我 ...

  10. Excel随机生成批量日期,以及注意事项

    这个是WPS里写的一个函数,用来随机生成日期.首先E1和E2是两个日期端点,右键把单元格格式先设置成“日期”中的“xxxx年xx月xx日 xx:xx”,然后E3=E1-E2算出它们的距离. 在E4里面 ...