MPAndroidChart 库LineChart使用总结

2024-01-14 03:20

本文主要是介绍MPAndroidChart 库LineChart使用总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

`LineChart` 是 MPAndroidChart 库中的一个组件,用于绘制曲线图。下面总结了一些 `LineChart` 常用的用例和方法:

1. **基本设置:**
   - 创建 `LineChart` 实例:`LineChart lineChart = new LineChart(context);`
   - 设置描述文本是否可见:`lineChart.getDescription().setEnabled(false);`
   - 设置是否启用双击缩放:`lineChart.setDoubleTapToZoomEnabled(false);`
   - 设置 X 轴数值格式化:`lineChart.getXAxis().setValueFormatter(new XAxisValueFormatter());`
   - 设置图表选中监听器:`lineChart.setOnChartValueSelectedListener(new OnChartValueSelectedListenerImpl());`
   - 设置 X 轴的位置:`lineChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);`
   - 设置动画效果:`lineChart.animateXY(1000, 1000);`

2. **坐标轴设置:**
   - 获取左侧 Y 轴:`YAxis leftAxis = lineChart.getAxisLeft();`
   - 获取右侧 Y 轴:`YAxis rightAxis = lineChart.getAxisRight();`
   - 启用/禁用 Y 轴网格线:`leftAxis.setDrawGridLines(true);`
   - 设置 Y 轴网格线颜色:`leftAxis.setGridColor(Color.BLACK);`
   - 设置 Y 轴网格线间距:`leftAxis.setGranularity(3f);`
   - 设置 Y 轴标签是否显示:`leftAxis.setDrawLabels(true);`
   - 设置 Y 轴最小值:`leftAxis.setAxisMinimum(0f);`
   - 设置 Y 轴最大值:`leftAxis.setAxisMaximum(10f);`

3. **限制线:**
   - 添加限制线到左侧 Y 轴:`LimitLine limitLine = new LimitLine(3.5f, "Upper Limit"); leftAxis.addLimitLine(limitLine);`

4. **MarkerView:**
   - 自定义 MarkerView:`CustomMarkerView markerView = new CustomMarkerView(context, R.layout.custom_marker_view); lineChart.setMarker(markerView);`

5. **数据设置:**
   - 创建 `LineDataSet` 实例:`LineDataSet dataSet = new LineDataSet(entries, "Label");`
   - 配置 `LineDataSet` 属性:颜色、线宽、点半径等
   - 创建 `LineData` 实例:`LineData lineData = new LineData(dataSet);`
   - 设置图表数据:`lineChart.setData(lineData);`
   - 刷新图表:`lineChart.invalidate();`

6. **值选中监听器:**
   - 实现 `OnChartValueSelectedListener` 接口:`private class OnChartValueSelectedListenerImpl implements OnChartValueSelectedListener { ... }`

7. **自定义 X 轴标签格式:**
   - 创建自定义的 `ValueFormatter` 类,继承自 `com.github.mikephil.charting.formatter.ValueFormatter`。

8. **动态更新图表数据:**
   - 添加单个数据点:`lineDataSet.addEntry(entry);`
   - 更新图表:`lineChart.notifyDataSetChanged(); lineChart.invalidate();`

以上总结包括了基本设置、坐标轴设置、限制线、MarkerView、数据设置、值选中监听器、自定义 X 轴标签格式以及动态更新图表数据等常用用例和方法。您可以根据实际需求在这些基础上进行更多的定制和扩展。

package com.jaredrummler.compent;import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.widget.TextView;import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.MarkerView;
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.highlight.Highlight;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import com.github.mikephil.charting.utils.MPPointF;
import com.jaredrummler.materialspinner.example.R;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;public class RecordLineChart {private final LineChart lineChart;private final Context context;private static List<BloodSugarDataSet> dataSets;public RecordLineChart(Context context, LineChart lineChart) {this.context = context;this.lineChart = lineChart;initializeChart();}private void initializeChart() {lineChart.getDescription().setEnabled(false);lineChart.setDoubleTapToZoomEnabled(false);lineChart.getXAxis().setValueFormatter(new XAxisValueFormatter());lineChart.setOnChartValueSelectedListener(new OnChartValueSelectedListenerImpl());XAxis xAxis = lineChart.getXAxis();xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); // Set the position to bottom
//        xAxis.setDrawGridLines(true);
//        lineChart.animateX(1000);lineChart.animateXY(1000,1000);YAxis leftAxis = lineChart.getAxisLeft();leftAxis.setDrawGridLines(true); // 启用 Y 轴的网格线
//        leftAxis.setGridColor(Color.BLACK);leftAxis.setGranularity(3f); // 设置 Y 轴的网格线间距leftAxis.setGranularityEnabled(true); // 启用 Y 轴的网格线间距leftAxis.setDrawLabels(true); // 不显示 Y 轴标签
//        leftAxis.setAxisMinimum(0f); // 设置 Y 轴的最小值为 0
//        leftAxis.setGranularity(1f); // Set the granularity to control the number of labels
//        leftAxis.setLabelCount(2, true); // Set the number of labels to be displayedYAxis rightAxis = lineChart.getAxisRight();rightAxis.setDrawGridLines(true); // 启用 Y 轴的网格线
//        rightAxis.setGridColor(Color.BLACK);rightAxis.setGranularity(3f); // 设置 Y 轴的网格线间距rightAxis.setGranularityEnabled(true); // 启用 Y 轴的网格线间距rightAxis.setDrawLabels(true); // 不显示 Y 轴标签
//        rightAxis.setAxisMinimum(0f); // 设置 Y 轴的最小值为 0
//        rightAxis.setGranularity(1f); // Set the granularity to control the number of labels
//        rightAxis.setLabelCount(2, true); // Set the number of labels to 0 to hide them
//        rightAxis.setGridColor(Color.TRANSPARENT); // Set the color of the right grid lines to transparent// Set MarkerViewCustomMarkerView markerView = new CustomMarkerView(context, R.layout.custom_marker_view);lineChart.setMarker(markerView);}public void setData(List<BloodSugarDataSet> dataSets) {this.dataSets = dataSets;LineData lineData = new LineData();for (BloodSugarDataSet dataSet : dataSets) {lineData.addDataSet(dataSet.getLineDataSet());addLimitLine(dataSet);}lineChart.clear();lineChart.setData(lineData);lineChart.invalidate();}private void addLimitLine(BloodSugarDataSet dataSet) {// 添加血糖范围线LimitLine lowerLimit = new LimitLine(dataSet.getLowerLimitValue(), "");lowerLimit.setLineWidth(2f);lowerLimit.enableDashedLine(10f, 10f, 0f);lowerLimit.setLineColor(Color.BLUE);LimitLine upperLimit = new LimitLine(dataSet.getUpperLimitValue(), "");upperLimit.setLineWidth(2f);upperLimit.enableDashedLine(10f, 10f, 0f);upperLimit.setLineColor(Color.RED);lineChart.getAxisLeft().addLimitLine(lowerLimit);lineChart.getAxisLeft().addLimitLine(upperLimit);}public void addData(BloodSugarData data, int dataSetIndex) {if (dataSetIndex >= 0 && dataSetIndex < dataSets.size()) {BloodSugarDataSet dataSet = dataSets.get(dataSetIndex);dataSet.addData(data);updateChart();}}public void updateChart() {LineData lineData = lineChart.getData();if (lineData != null) {lineData.notifyDataChanged();lineChart.notifyDataSetChanged();lineChart.invalidate();}}private class OnChartValueSelectedListenerImpl implements OnChartValueSelectedListener {@Overridepublic void onValueSelected(Entry e, Highlight h) {}@Overridepublic void onNothingSelected() {// Handle nothing selected}}private static class XAxisValueFormatter extends com.github.mikephil.charting.formatter.ValueFormatter {@Overridepublic String getAxisLabel(float value, com.github.mikephil.charting.components.AxisBase axis) {
//            SimpleDateFormat sdf = new SimpleDateFormat("MM/dd", Locale.getDefault());
//            String xLabel = sdf.format(new Date((long) value));
//            Log.i("TAG", value + "getAxisLabel: " + xLabel);
//            return xLabel;return dataSets.get(0).bloodSugarList.get((int) value).getDate();}}private static class CustomMarkerView extends MarkerView {private final TextView tvBloodSugar;private final TextView tvTimePeriod;private final TextView tvMeasurementTime;public CustomMarkerView(Context context, int layoutResource) {super(context, layoutResource);tvBloodSugar = findViewById(R.id.tvContent);tvTimePeriod = findViewById(R.id.tvPeriod);tvMeasurementTime = findViewById(R.id.tvTime);}@Overridepublic void refreshContent(Entry e, Highlight highlight) {if (e != null ) {BloodSugarData data = (BloodSugarData) e.getData();tvBloodSugar.setText("血糖值: " + data.getBloodSugar());tvTimePeriod.setText("时段: " + data.getTimePeriod());tvMeasurementTime.setText("检测时间: " + data.getMeasurementTime());}super.refreshContent(e, highlight);}@Overridepublic MPPointF getOffset() {return new MPPointF(-(getWidth() / 2f), -getHeight());}}public static class BloodSugarData {private String date;private float bloodSugar;private String timePeriod;private String measurementTime;public BloodSugarData(String date, float bloodSugar, String timePeriod, String measurementTime) {this.date = date;this.bloodSugar = bloodSugar;this.timePeriod = timePeriod;this.measurementTime = measurementTime;}public String getDate() {return date;}public float getBloodSugar() {return bloodSugar;}public String getTimePeriod() {return timePeriod;}public String getMeasurementTime() {return measurementTime;}}public static class BloodSugarDataSet {private LineDataSet lineDataSet;private List<BloodSugarData> bloodSugarList;private float lowerLimitValue = 3.9f;private float upperLimitValue = 9.0f;public float getLowerLimitValue() {return lowerLimitValue;}public float getUpperLimitValue() {return upperLimitValue;}public BloodSugarDataSet(String label, int lineColor, boolean showPoints) {bloodSugarList = new ArrayList<>();lineDataSet = createLineDataSet(label, lineColor);setShowDataPoints(showPoints);}public void setGlucoseValueRange(float lowerLimitValue, float upperLimitValue) {this.lowerLimitValue = lowerLimitValue;this.upperLimitValue = upperLimitValue;}private LineDataSet createLineDataSet(String label, int lineColor) {LineDataSet set = new LineDataSet(null, label);set.setAxisDependency(YAxis.AxisDependency.LEFT);set.setColor(lineColor);set.setCircleColor(lineColor);set.setLineWidth(2f);set.setCircleRadius(4f);set.setValueTextSize(10f);set.setValueTextColor(Color.BLACK);set.setMode(LineDataSet.Mode.CUBIC_BEZIER);set.setDrawFilled(true);set.setFillColor(lineColor);return set;}public void setShowDataPoints(boolean show) {lineDataSet.setDrawCircles(show);lineDataSet.setDrawValues(show);}public LineDataSet getLineDataSet() {return lineDataSet;}public List<BloodSugarData> getBloodSugarList() {return bloodSugarList;}public void addData(BloodSugarData data) {SimpleDateFormat sdf = new SimpleDateFormat("MM/dd", Locale.getDefault());try {Date date = sdf.parse(data.getDate());Entry entry = new Entry(date.getTime(), data.getBloodSugar());entry.setData(data);lineDataSet.addEntry(entry);bloodSugarList.add(data);} catch (ParseException e) {throw new RuntimeException(e);}}public void addDataList(List<BloodSugarData> dataList) {List<Entry> entries = generateEntries(dataList);for (Entry item:entries) {lineDataSet.addEntry(item);}lineDataSet.setCircleColors(getCircleColors(entries));lineDataSet.setValueTextColors(Arrays.stream(getCircleColors(entries)).boxed().collect(Collectors.toList()));bloodSugarList.addAll(dataList);}// 生成 Entry 列表private List<Entry> generateEntries(List<BloodSugarData> bloodSugarList) {List<Entry> entries = new ArrayList<>();SimpleDateFormat sdf = new SimpleDateFormat("MM/dd", Locale.getDefault());for (int i = 0; i < bloodSugarList.size(); i++) {BloodSugarData data = bloodSugarList.get(i);try {Date date = sdf.parse(data.getDate());Entry entry = new Entry(i, data.getBloodSugar());entry.setData(data);entries.add(entry);} catch (ParseException e) {Log.e("TAG", "generateEntries: " + e.getMessage() );}}return entries;}// 根据血糖值是否在范围内设置坐标点颜色private int[] getCircleColors(List<Entry> entries) {int[] colors = new int[entries.size()];for (int i = 0; i < entries.size(); i++) {float glucoseValue = entries.get(i).getY();if (glucoseValue < lowerLimitValue) {colors[i] = Color.BLUE; // 不在范围内为ajqc色}else if(glucoseValue > upperLimitValue) {colors[i] = Color.RED; // 在范围内为绿色} else {colors[i] = Color.BLACK; // 不在范围内为红色}}return colors;}}
}

这篇关于MPAndroidChart 库LineChart使用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603766

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的