前段是使用LineChart画图,有不少总结,毕竟要满足客户各种需求。有个是曲线动态变化,有一个是查询后查看数据。

这个开源库的GitHub地址:

https://github.com/PhilJay/MPAndroidChart

1,直接看两个封装的代码

import android.content.Context;import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.DefaultValueFormatter;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.gizwits.opensource.appkit.view.LineChartMarkView;import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;/*** 动态参数变化*/public class DycLineChartManager {private LineChart lineChart;private YAxis leftAxis;private YAxis rightAxis;private XAxis xAxis;private LineData lineData;private LineDataSet lineDataSet;private SimpleDateFormat dfs = new SimpleDateFormat("HH:mm:ss");//设置日期格式  private List<String> timeList = new ArrayList<>(); //存储x轴的时间private int index = 0;private int indexX = 35;private List<Entry> entries = new ArrayList<>();private LineChartMarkView mv = null;protected int mDecimalDigits;protected DecimalFormat mFormat;//一条曲线public DynamicLineChartManager(LineChart mLineChart, String name, String unit, int color, int mDecimalDigits, int digits) {this.lineChart = mLineChart;this.mDecimalDigits = mDecimalDigits;leftAxis = lineChart.getAxisLeft();rightAxis = lineChart.getAxisRight();xAxis = lineChart.getXAxis();setup(digits);initLineChart(unit);initLineDataSet(name, color);}public void setup(int digits) {StringBuffer b = new StringBuffer();for (int i = 0; i < digits; ++i) {if (i == 0) {b.append(".");}b.append("0");}this.mFormat = new DecimalFormat("###,###,###,##0" + b.toString());}private long dateConvertMillionSec(String str) {long millionSeconds = 0;try {millionSeconds = new SimpleDateFormat("yyyyMMddHHmm").parse(str).getTime();} catch (ParseException e) {e.printStackTrace();}return millionSeconds;}/*** 初始化LineChar*/private void initLineChart(final String unit) {lineChart.setDrawGridBackground(false);//显示边界lineChart.setDrawBorders(true);//折线图例 标签 设置Legend legend = lineChart.getLegend();legend.setForm(Legend.LegendForm.LINE);legend.setTextSize(11f);//显示位置legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);legend.setDrawInside(false);Long time = System.currentTimeMillis();String temp = "";SimpleDateFormat now = new SimpleDateFormat("yyyyMMddHHmm");String strNow = now.format(time);time = dateConvertMillionSec(strNow);timeList.add(dfs.format(time));for (int i = 0; i < 360; i++) {//增加下一个5分钟的刻度time = time + 1000 * 5;temp = dfs.format(time);timeList.add(temp);}xAxis.setValueFormatter(new IAxisValueFormatter() {@Overridepublic String getFormattedValue(float value, AxisBase axis) {String temp = "";int n = (int) value % timeList.size();//修复了数组越界的异常if (n > 0 && n < timeList.size()) {String tradeDate = timeList.get(n);temp = tradeDate.substring(tradeDate.length() - 2, tradeDate.length());if (temp.equals("00")) {temp = tradeDate.substring(0, tradeDate.length() - 3);} else {temp = "";}}return temp;}});leftAxis.setValueFormatter(new IAxisValueFormatter() {@Overridepublic String getFormattedValue(float value, AxisBase axis) {String strTemp = mFormat.format(value) + " " + unit;return strTemp;}});//X轴设置显示位置在底部xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);xAxis.setGranularity(1f);//        xAxis.setSpaceMax(1f);//保证Y轴从0开始,不然会上移一点leftAxis.setAxisMinimum(0f);rightAxis.setAxisMinimum(0f);//将右边那条线隐藏lineChart.getAxisRight().setEnabled(false); // 隐藏右边 的坐标轴lineChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM); // 让x轴在下面lineChart.getXAxis().setGridColor(0x00ffffff);lineChart.getXAxis().setDrawAxisLine(false);lineChart.getAxisRight().setDrawAxisLine(false);lineChart.invalidate();}/*** 初始化折线(一条线)** @param name* @param color*/private void initLineDataSet(String name, int color) {for (int i = 0; i < timeList.size(); i++) {Entry entry = new Entry(i, 0);entries.add(entry);}lineDataSet = new LineDataSet(entries, name);lineDataSet.setLineWidth(1.5f);lineDataSet.setCircleRadius(1.5f);lineDataSet.setColor(color);lineDataSet.setCircleColor(color);lineDataSet.setFillColor(color);lineDataSet.setHighLightColor(color);setDescription("");lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);//设置曲线填充lineDataSet.setDrawFilled(true);lineDataSet.setValueTextSize(10f);//设置线型模式,设置CUBIC_BEZIER 时候,当数据跟密集,y轴数据很稀疏时候。线型更新时候会凸起//所以换成LINEARlineDataSet.setMode(LineDataSet.Mode.LINEAR);//添加一个空的 LineDatalineData = new LineData(lineDataSet);//是否显示值lineData.setDrawValues(false);//设置显示数据的多少位 很难找到这个方法lineData.setValueFormatter(new DefaultValueFormatter(mDecimalDigits));lineChart.setData(lineData);
//        lineChart.setScaleX(1f);//显示数量xAxis.setLabelCount(360);//显示的时候是按照多大的比率缩放显示,1f表示不放大缩小lineChart.zoom(1f, 1f, 0, 0);//缩放时候,能最大的显示范围lineChart.setVisibleXRangeMaximum(36);lineChart.invalidate();}/*** 动态添加数据(一条折线图)** @param number*/public void addEntry(float number, int digits) {Entry entry = new Entry(index, number);entries.set(index, entry);lineDataSet.setValues(entries);lineData = new LineData(lineDataSet);//是否显示值lineData.setDrawValues(false);//设置显示数据的多少位 很难找到这个方法lineData.setValueFormatter(new DefaultValueFormatter(digits));lineChart.setData(lineData);index++;//通知数据已经改变lineData.notifyDataChanged();lineChart.notifyDataSetChanged();if (index > indexX) {indexX = indexX + 35;//移到某个位置lineChart.moveViewToX(index - 2);}if (mv != null) {mv.refreshContent(entry, null);}lineChart.invalidate();}/*** 设置Y轴值*/public void setYAxis(float max, float min, int labelCount) {if (max < min) {return;}leftAxis.setAxisMaximum(max);leftAxis.setAxisMinimum(min);leftAxis.setLabelCount(labelCount, false);lineChart.invalidate();}/*** 设置 可以显示X Y 轴自定义值的 MarkerView*/public void setMarkerView(Context context) {mv = new LineChartMarkView(context, xAxis.getValueFormatter(), timeList, mDecimalDigits);mv.setChartView(lineChart);lineChart.setMarker(mv);lineChart.invalidate();}/*** 设置描述信息** @param str*/public void setDescription(String str) {Description description = new Description();description.setText(str);description.setTextSize(14);lineChart.setDescription(description);lineChart.invalidate();}
}
import android.content.Context;import com.custom.net.HistoryData;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.DefaultValueFormatter;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.IValueFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import com.github.mikephil.charting.utils.ViewPortHandler;
import com.gizwits.opensource.appkit.view.LineChartMarkView;import java.lang.annotation.Target;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;public class LineChartManager {private LineChart lineChart;private YAxis leftAxis;private YAxis rightAxis;private XAxis xAxis;private LineData lineData;private LineDataSet lineDataSet;List<String> dataXList = new LinkedList<>();protected int mDecimalDigits;protected DecimalFormat mFormat;//一条曲线public ShowLineChartManager(LineChart mLineChart, String unit, int digits) {this.lineChart = mLineChart;leftAxis = lineChart.getAxisLeft();rightAxis = lineChart.getAxisRight();xAxis = lineChart.getXAxis();setup(digits);initLineChart(unit);}public void setup(int digits) {StringBuffer b = new StringBuffer();for (int i = 0; i < digits; ++i) {if (i == 0) {b.append(".");}b.append("0");}this.mFormat = new DecimalFormat("###,###,###,##0" + b.toString());}/*** 初始化LineChar*/private void initLineChart(final String unit) {lineChart.setDrawGridBackground(false);//显示边界lineChart.setDrawBorders(true);//折线图例 标签 设置Legend legend = lineChart.getLegend();legend.setForm(Legend.LegendForm.LINE);legend.setTextSize(11f);//显示位置legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);legend.setDrawInside(false);//设置图表距离上下左右的距离lineChart.setExtraOffsets(0, 0, 0, 10);//X轴设置显示位置在底部xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);xAxis.setGranularity(1f);xAxis.setGridLineWidth(2f);leftAxis.setValueFormatter(new IAxisValueFormatter() {@Overridepublic String getFormattedValue(float value, AxisBase axis) {String strTemp = mFormat.format(value) + " " + unit;return strTemp;}});//保证Y轴从0开始,不然会上移一点leftAxis.setAxisMinimum(0f);rightAxis.setAxisMinimum(0f);//将右边那条线隐藏lineChart.getAxisRight().setEnabled(false); // 隐藏右边 的坐标轴lineChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM); // 让x轴在下面lineChart.getXAxis().setGridColor(0x00ffffff);// 设置右边的label不可用rightAxis.setDrawLabels(false);// 设置右边的线不可用rightAxis.setDrawGridLines(false);// 设置右边的线不可用rightAxis.setDrawAxisLine(false);}/*** 初始化折线(一条线)*/public void initLineDataSet(final List<Float> dataList, String name, int color, int digits) {float value = Collections.max(dataList);this.mDecimalDigits = digits;List<Entry> entries = new ArrayList<>();for (int i = 0; i < dataList.size(); i++) {/*** 在此可查看 Entry构造方法,可发现 可传入数值 Entry(float x, float y)* 也可传入Drawable, Entry(float x, float y, Drawable icon) 可在XY轴交点 设置Drawable图像展示*/Entry entry = new Entry(i, dataList.get(i));entries.add(entry);}// 每一个LineDataSet代表一条线lineDataSet = new LineDataSet(entries, name);lineDataSet.setLineWidth(1.5f);lineDataSet.setCircleRadius(1.5f);lineDataSet.setColor(color);lineDataSet.setCircleColor(color);lineDataSet.setFillColor(color);lineDataSet.setHighLightColor(color);setDescription("");lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);//设置曲线填充lineDataSet.setDrawFilled(true);lineDataSet.setValueTextSize(10f);lineDataSet.setMode(LineDataSet.Mode.LINEAR);//设置参数lineData = new LineData(lineDataSet);//设置显示数据的多少位 很难找到这个方法lineData.setValueFormatter(new DefaultValueFormatter(digits));//是否显示值lineData.setDrawValues(false);lineChart.setData(lineData);xAxis.setLabelCount(30);//显示的时候是按照多大的比率缩放显示,1f表示不放大缩小lineChart.zoom(1f, 1f, 0, 0);lineChart.setScaleMinima(1f,1f);lineChart.setVisibleXRangeMaximum(30);//移到某个位置lineChart.moveViewToX(lineData.getEntryCount());lineChart.invalidate();}/*** 设置Y轴值*/public void setYAxis(float max, float min, int labelCount) {if (max < min) {return;}leftAxis.setAxisMaximum(max);leftAxis.setAxisMinimum(min);leftAxis.setLabelCount(labelCount, false);lineChart.invalidate();}/*** 设置X轴值*/public void setXAxis(final List<HistoryData> dataList) {for (HistoryData data : dataList) {String tradeDate = data.getDatetime();if (tradeDate.length() >= 10) {String temp = tradeDate.substring(tradeDate.length() - 2, tradeDate.length());if (temp.equals("00")) {tradeDate = tradeDate.substring(0, 4) + "年" +tradeDate.substring(tradeDate.length() - 6, tradeDate.length() - 4) + "月" +tradeDate.substring(tradeDate.length() - 4, tradeDate.length() - 2) + "日";} else {tradeDate = tradeDate.substring(0, 4) + "年" +tradeDate.substring(tradeDate.length() - 6, tradeDate.length() - 4) + "月" +tradeDate.substring(tradeDate.length() - 4, tradeDate.length() - 2) + "日" +temp.replaceFirst("^0*", "") + "时";}dataXList.add(tradeDate);}}xAxis.setValueFormatter(new IAxisValueFormatter() {@Overridepublic String getFormattedValue(float value, AxisBase axis) {String tradeDate = dataList.get((int) value).getDatetime();if (tradeDate.length() >= 10) {String temp = tradeDate.substring(tradeDate.length() - 2, tradeDate.length());if (temp.equals("00") || temp.equals("24")) {tradeDate = tradeDate.substring(tradeDate.length() - 6, tradeDate.length() - 4) + "-" +tradeDate.substring(tradeDate.length() - 4, tradeDate.length() - 2);} else {tradeDate = temp.replaceFirst("^0*", "");switch (tradeDate) {case "3":case "6":case "9":case "12":case "15":case "18":case "21":break;default:tradeDate = "";break;}}}return tradeDate;}});lineChart.invalidate();}/*** 设置 可以显示X Y 轴自定义值的 MarkerView*/public void setMarkerView(Context context) {LineChartMarkView mv = new LineChartMarkView(context, xAxis.getValueFormatter(), dataXList, mDecimalDigits);mv.setChartView(lineChart);lineChart.setMarker(mv);lineChart.invalidate();}/*** 设置描述信息** @param str*/public void setDescription(String str) {Description description = new Description();description.setText(str);description.setTextSize(14);lineChart.setDescription(description);lineChart.invalidate();}
}

里面涉及到很多小技巧。

还有一个弹出来显示的数值。

package com.gizwits.opensource.appkit.view;import android.annotation.SuppressLint;
import android.content.Context;
import android.text.TextUtils;
import android.widget.TextView;import com.github.mikephil.charting.charts.Chart;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.MarkerView;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import com.github.mikephil.charting.utils.MPPointF;
import com.gizwits.opensource.appkit.R;import java.text.DecimalFormat;
import java.util.EventListener;
import java.util.LinkedList;
import java.util.List;/*** Created by xhu_ww on 2018/6/1.* description:*/
public class LineChartMarkView extends MarkerView {private TextView tvDate;private TextView tvValue0;private IAxisValueFormatter xAxisValueFormatter;List<String> dataXList = new LinkedList<>();protected DecimalFormat mFormat;protected int mDecimalDigits;public LineChartMarkView(Context context, IAxisValueFormatter xAxisValueFormatter, List<String> dataXList, int digits) {super(context, R.layout.layout_markview);this.xAxisValueFormatter = xAxisValueFormatter;this.dataXList = dataXList;this.mDecimalDigits = digits;setup(mDecimalDigits);tvDate = (TextView) findViewById(R.id.tv_date);tvValue0 = (TextView) findViewById(R.id.tv_value0);}public void setup(int digits) {this.mDecimalDigits = digits;StringBuffer b = new StringBuffer();for(int i = 0; i < digits; ++i) {if(i == 0) {b.append(".");}b.append("0");}this.mFormat = new DecimalFormat("###,###,###,##0" + b.toString());}@SuppressLint("SetTextI18n")@Overridepublic void refreshContent(Entry e, Highlight highlight) {Chart chart = getChartView();if (chart instanceof LineChart) {LineData lineData = ((LineChart) chart).getLineData();//获取到图表中的所有曲线List<ILineDataSet> dataSetList = lineData.getDataSets();for (int i = 0; i < dataSetList.size(); i++) {LineDataSet dataSet = (LineDataSet) dataSetList.get(i);//获取到曲线的所有在Y轴的数据集合,根据当前X轴的位置 来获取对应的Y轴值float y = dataSet.getValues().get((int) e.getX()).getY();if (i == 0) {tvValue0.setText(dataSet.getLabel() + ":" + mFormat.format(y));}}
//            String temp = xAxisValueFormatter.getFormattedValue(e.getX(), null);//获取全部刻度,包括不显示的刻度String temp = dataXList.get((int) e.getX());if (!TextUtils.isEmpty(temp)) {tvDate.setText(temp);}}super.refreshContent(e, highlight);}@Overridepublic MPPointF getOffset() {return new MPPointF(-(getWidth() / 2), -getHeight());}
}

MPAndroidChart 曲线图LineChart使用部分示例相关推荐

  1. Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)

    目录 前言 本文涉及文章 其他相关文章 1.数据准备 1.1 数据来源 2.曲线展示 2.1 MPAndroidChart获取 2.2 数据对象获取 2.3 数据展示 3.曲线完善 3.1 图表背景. ...

  2. android好用的曲线图控件,Android图表控件MPAndroidChart——曲线图LineChart的使用(多条曲线)...

    发现最新的MPAndroidChart和以前版本的使用有一些差距,就写下了现在新版的使用方法 相关文章: Android图表控件MPAndroidChart的简单介绍(MPAndroidChart3. ...

  3. Python-Matplotlib动态曲线图(linechart)绘制

    效果预览 配上动感的音乐感觉就是不一样啊,要达到上述效果除了核心的Matplotlib绘图外,其他工具和上篇推文 Hans Rosling Charts Matplotlib 绘制所使用的工具一样啊. ...

  4. MPAndroidChart(LineChart、BarChart 其它同理) 视图边距修改

    MPAndroidChart绘制图表后,视图边距是自动计算的,跟UI有出入,setViewPortOffsets方法容易造成内容显示不全,setExtraOffsets方法是用来设置自动计算的偏移量之 ...

  5. Android图表控件MPAndroidChart——LineChart实现 XY轴、原点线的直尺刻度样式

    接上文: Android图表控件MPAndroidChart--曲线图LineChart的使用(多条曲线) 其他相关文章: Android图表控件MPAndroidChart的简单介绍(MPAndro ...

  6. android开发原点表框架,Android图表控件MPAndroidChart——LineChart实现 XY轴、原点线的直尺刻度样式...

    接上文: Android图表控件MPAndroidChart--曲线图LineChart的使用(多条曲线) 其他相关文章: Android图表控件MPAndroidChart的简单介绍(MPAndro ...

  7. Android图表控件MPAndroidChart——BarChart实现多列柱状图以及堆积柱状图

    目录 前言 1. 数据准备 1.1 数据来源 2. 图表展示 2.1 MPAndroidChart获取 2.2 数据对象获取 2.3 数据展示 3. 柱状图外观完善 3.1 去掉图表外框,描述内容以及 ...

  8. Android图表控件MPAndroidChart的使用

    转载一篇Android图表控件MPAndroidChart的博客. 相关文章: Android图表控件MPAndroidChart的简单介绍(MPAndroidChart3.0) Android图表控 ...

  9. MpAndroidChart-LineChart 折线图使用(含动态添加点,动态添加曲线)

    目录 零.简介 一.MpAndroidChart的基本使用 1.依赖:project的build.gradle 中添加 2.app的build.gradle 中添加 3.举例 4.常用API 二.Mp ...

最新文章

  1. 2021年10个激动人心的工程里程碑
  2. Eclipse一直building workspace问题解决
  3. 人工智能实验评价指标_电子科大人工智能团队最新研究成果,5秒诊断癌症
  4. python tkinter怎么读_Tkinter GUI与阅读系列
  5. 图灵社区 和 大家网
  6. linux配置ip地址 suse_SUSE Linux下设置IP的两种方法
  7. java8四大核心函数式接口(模拟实现,全网最通俗易懂)
  8. 虽然现在用APACHE COMMONS DBCP可以非常方便的建立数据库连接池,
  9. NMOSPMOSADC/示波器采样率
  10. fiddler电脑抓包和HttpCanary(小黄鸟)手机抓包教程
  11. 实训任务4:Hadoop综合操作
  12. seo入门级教程!再看不懂就放弃做互联网吧!
  13. win10部署milvus以图搜图2.0
  14. python基础练习题1(12题)
  15. 计算机二级《MS Office》考试真题及答案
  16. 我实现的一些Abp模块
  17. 网络工程师高薪就业行业有哪些
  18. 我和Python的Py交易》》》》》》函数
  19. JVM对象创建与内存分配机制学习总结
  20. 六个在线生成网址二维码的API接口

热门文章

  1. 计算机毕业设计班级毕业纪念册系统ssm框架【代码讲解+安装调试+文档指导】
  2. 既节能又省钱的数据中心布线解决方案
  3. 青岛新生儿手续办理事项
  4. 常识:火线、零线、地线
  5. Scrapy Splash
  6. 1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯;TPE-MB结构式
  7. 安全扫描失败无法上传_教你3招解决PDF文字无法复制的所有问题
  8. 离散粒子群(DPSO)——任务分类
  9. 奇异矩阵和非奇异矩阵,伪逆矩阵
  10. OC门、OD门与推挽输出