全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Android图表 MPAndroidChart折线图

1.介绍

MPAndroidChart GitHub地址 

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

效果图:

2.引入开源库

在项目根目录的build.gradle文件中加入如下代码

allprojects {
  repositories {
    maven { url "https://jitpack.io" }
  }
}

在app根目录的buil.gradle文件中加入依赖

dependencies {
  compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
}

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轴向右偏移的30dp
  chart.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;
}

设置图表数据

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();
  }
}

更新图表

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() {
    @Override
    public String getFormattedValue(float value, AxisBase axis) {
      return xValuesProcess(valueType)[(int) value];
    }
  });

  chart.invalidate();
  setChartData(chart, values);
}

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[]{};
}

在Activity中使用

ChartUtils.initChart(chart);
ChartUtils.notifyDataSetChanged(chart, getData(), ChartUtils.dayValue);

布局文件

<com.github.mikephil.charting.charts.LineChart
    android:id="@+id/chart"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

4.遇到的问题

  • 在设置x轴水平方向平移时,xAxis.setXOffset()方法不起作用,这让我研究了好长时间,最后无奈使用图表平移方法chart.setExtraLeftOffset()来抵消y轴的平移,已经提交到了Issues上,有解答会在博客中更新。
  • 目前y轴数据只能通过设置最大值、最小值、显示个数的方式来显示数据(如果不设置会自动计算),还没有找到自定义显示数据的方法,有了解的小伙伴可以留言告诉我啊。
  • 自定义x轴数据的时候记得要算好对应的值,Demo中只用到了7个点,所以比较简单,但是x轴数据比较多的话,就要算一下了,如果有不懂的地方可以给我留言或者发私信。

5.写在最后

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

官方文档

完整的Demo下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# mpandroidchart折线图  # android开源折线图表  # android折线图开源库  # MPAndroidChart开源图表库的使用介绍之饼状图、折线图和柱状图  # Android MPAndroidChart开源库图表之折线图的实例代码  # Android自定义View实现折线图效果  # Android绘制动态折线图  # Android HelloChart开源库图表之折线图的实例代码  # Android开发之天气趋势折线图  # Android自定义控件实现折线图  # Android自定义可左右滑动和点击的折线图  # Android自定义View简易折线图控件(二)  # Android开发RecyclerView实现折线图效果  # 暂无  # 数据处理  # 自定义  # 都是  # 本周  # 今日  # 还没有  # 成了  # 偏移量  # 不需要  # 和我  # 之处  # 很多人  # 不可以  # 不懂  # 下了  # 会在  # 坐标点  # 我把  # 要注意 


相关文章: 建站OpenVZ教程与优化策略:配置指南与性能提升  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  网站制作说明怎么写,简述网页设计的流程并说明原因?  如何通过虚拟主机快速搭建个人网站?  建站主机服务器选型指南与性能优化方案解析  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  网站制作公司排行榜,四大门户网站排名?  python的本地网站制作,如何创建本地站点?  宝塔面板创建网站无法访问?如何快速排查修复?  微信小程序 input输入框控件详解及实例(多种示例)  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何高效利用200m空间完成建站?  家庭服务器如何搭建个人网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  招商网站制作流程,网站招商广告语?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  h5网站制作工具有哪些,h5页面制作工具有哪些?  如何在阿里云虚拟服务器快速搭建网站?  建站10G流量真的够用吗?如何应对访问高峰?  SQL查询语句优化的实用方法总结  建站之星上传入口如何快速找到?  如何高效完成独享虚拟主机建站?  海南网站制作公司有哪些,海口网是哪家的?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  建站之星如何取消后台验证码生成?  营销式网站制作方案,销售哪个网站招聘效果最好?  建站与域名管理如何高效结合?  制作农业网站的软件,比较好的农业网站推荐一下?  利用JavaScript实现拖拽改变元素大小  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Python如何创建带属性的XML节点  建站之星如何实现网站加密操作?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  建站主机服务器选购指南:轻量应用与VPS配置解析  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  建站之星后台管理系统如何操作?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  再谈Python中的字符串与字符编码(推荐)  如何选择高效响应式自助建站源码系统?  南京网站制作费用,南京远驱官方网站?  股票网站制作软件,网上股票怎么开户?  广州商城建站系统开发成本与周期如何控制?  电商网站制作公司有哪些,1688网是什么意思?  建站之星如何助力网站排名飙升?揭秘高效技巧  如何在橙子建站中快速调整背景颜色? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。