单列的堆叠柱状图

目的

MSingleColumnStackBarChart类被设计用于创建只有单列的堆叠柱状图,用于血糖数据的统计。以下是封装这个类的目的的详细描述:

  1. 抽象复杂性: 通过创建MSingleColumnStackBarChart类,你将复杂的MPAndroidChart库的使用和配置封装在一个独立的类中。这有助于降低代码的复杂性,使得在其他部分的代码中更容易理解和维护。

  2. 提高可读性: 将与图表配置相关的代码集中在一个类中,使得主要的业务逻辑部分的代码更加清晰。其他开发者在查看代码时能够更轻松地理解图表的配置和使用方式。

  3. 重用性: 通过封装这个类,你可以在不同的部分或项目中重复使用相同的图表配置。这意味着,如果将来有其他地方需要显示类似的单列堆叠柱状图,你可以轻松地引入这个类,而无需重新实现相同的配置。

  4. 模块化: 类的封装使得代码更加模块化。这允许你将图表的配置和数据处理与其他功能分离,促使代码更易于组织和维护。

  5. 简化调用: 通过提供简单的接口,类的使用者只需几行代码就能创建和显示单列堆叠柱状图。这有助于降低使用图表功能时的学习曲线,并使代码更加整洁。

总体而言,MSingleColumnStackBarChart类的封装旨在提供一种简单、灵活且易于使用的方式,以满足特定场景下(如血糖数据统计)显示单列堆叠柱状图的需求。这样的封装是为了在开发中提高效率、降低出错概率,并促使代码更具可维护性。

示例 

中间的就是柱状形,只要按百分比进行堆叠显示。

调用示例
List<MSingleColumnStackBarChart.MBarData> dataList = new ArrayList<>();for (int x = 0; x < 1; x++) {MSingleColumnStackBarChart.MBarData data = new MSingleColumnStackBarChart.MBarData(15, getColor(R.color.colorHHigh), "15% 很高 > 13.0 mmol/L");dataList.add(data);data = new MSingleColumnStackBarChart.MBarData(10, getColor(R.color.colorHigh), "10% 偏高 > 10.0 mmol/L");dataList.add(data);data = new MSingleColumnStackBarChart.MBarData(60, getColor(R.color.colorNormal), "60% 正常 3.9-10.0 mmol/L");dataList.add(data);data = new MSingleColumnStackBarChart.MBarData(10, getColor(R.color.colorLow), "10% 偏低 < 3.9 mmol/L");dataList.add(data);data = new MSingleColumnStackBarChart.MBarData(5, getColor(R.color.colorLLow), "5% 很低 < 3.0 mmol/L ");dataList.add(data);
}BarChart barChart = findViewById(R.id.bar_chart);
MSingleColumnStackBarChart barChartView = new MSingleColumnStackBarChart(barChart);
barChartView.setBarDataSets(dataList);
完整的代码实现类
package com.jaredrummler.compent;import android.graphics.Color;
import android.graphics.PointF;import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.LegendEntry;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;/*** author :hello* date : 2024/1/15 8:47* description : 只有一列数据的StackBarChart*/
public class MSingleColumnStackBarChart {private BarChart barChart;private MLegend mLegend;public MSingleColumnStackBarChart(BarChart barChart) {this.barChart = barChart;this.mLegend = new MLegend();init();}public void setBarDataSets(List<MBarData> dataList) {MBarDataSet barDataSet = new MBarDataSet(0, dataList);BarData barData = new BarData(barDataSet.getBarDataSet());barData.setBarWidth(.8f);this.barChart.setData(barData);this.mLegend.setLegendConfig(barDataSet.getBarDataSetsColors(), barDataSet.getBarLegendLabels().toArray(new String[0]));this.barChart.invalidate();}public void init() {setXAxisConfig();setYAxisConfig();///所有值均绘制在其条形顶部上方barChart.setDrawValueAboveBar(false);// 添加下面这行代码,关闭堆叠模式barChart.setDrawBarShadow(false);barChart.setFitBars(true);barChart.getDescription().setEnabled(false);barChart.animateXY(1000,1000);//选中高亮显示barChart.setHighlightFullBarEnabled(false);//双击缩放barChart.setDoubleTapToZoomEnabled(false);// 设置 是否可以缩放barChart.setScaleEnabled(false);barChart.setDrawGridBackground(false);barChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {@Overridepublic void onValueSelected(Entry e, Highlight h) {mLegend.showLegendSelected(h.getStackIndex());}@Overridepublic void onNothingSelected() {mLegend.resetLegendDefault();}});barChart.invalidate(); // 刷新图表}private void setXAxisConfig() {// 使柱状图的中心与 X 轴标签对齐XAxis xAxis = barChart.getXAxis();xAxis.setEnabled(false);xAxis.setDrawLabels(false);//取消 垂直 网格线xAxis.setDrawGridLines(false);}private void setYAxisConfig() {YAxis yLeftAxis = barChart.getAxisLeft();yLeftAxis.setEnabled(false);yLeftAxis.setDrawLabels(false);yLeftAxis.setDrawGridLines(false);yLeftAxis.setAxisMinimum(0);yLeftAxis.setAxisMaximum(100);YAxis yRightAxis = barChart.getAxisRight();yRightAxis.setEnabled(false);yRightAxis.setDrawLabels(false);yRightAxis.setDrawGridLines(false);}private static class MBarDataSet {private BarDataSet barDataSet;private List<BarEntry> barEntries;private List<MBarData> dataList;public MBarDataSet(int index, List<MBarData> dataList) {this.dataList = dataList;barEntries = covertToBarEntry(index, dataList);barDataSet = new BarDataSet(barEntries, "");barDataSet.setColors(dataList.stream().map(MBarData::getColor).collect(Collectors.toList()));
//            barDataSet.setValueTextSize(10f);barDataSet.setDrawValues(false);
//            barDataSet.setValueTextColor(Color.WHITE);
//            barDataSet.setValueFormatter(new ValueFormatter() {
//                @Override
//                public String getFormattedValue(float value) {
//                    return String.format("%.1f", value) + "%";
//                }
//
//            }); // 设置值文本的位置为外部barDataSet.setBarShadowColor(Color.WHITE);barDataSet.setBarBorderWidth(2f);barDataSet.setBarBorderColor(Color.WHITE);}public BarDataSet getBarDataSet() {return barDataSet;}public List<BarEntry> getBarEntries() {return barEntries;}private List<BarEntry> covertToBarEntry(float index, List<MBarData> dataList) {// y 数据ArrayList<BarEntry> yValues = new ArrayList<>();float[] stackedValues = new float[dataList.size()];// 遍历 yourDataList,获取每个数据项的百分比值,构建堆叠数据for (int i = 0; i < dataList.size(); i++) {float yValue = dataList.get(i).getYValue();stackedValues[i] = yValue;}BarEntry barEntry = new BarEntry(index, stackedValues);yValues.add(barEntry);return yValues;}private List<Integer> getBarDataSetsColors() {List<Integer> barColors = new ArrayList<>();for (MBarData data : this.dataList) {barColors.add(data.getColor());}return barColors;}private List<String> getBarLegendLabels() {List<String> legendLabels = new ArrayList<>();for (MBarData data : this.dataList) {legendLabels.add(data.getLabel());}return legendLabels;}}public static class MBarData {private float yValue;private int color;private String label;public MBarData(float percentage, int color, String label) {this.yValue = percentage;this.color = color;this.label = label;}public float getYValue() {return yValue;}public int getColor() {return color;}public String getLabel() {return label;}}private class MLegend {public static final float SELECTED_FORM_SIZE = 16f;public static final float DEFAULT_FORM_SIZE = 10f;public void showLegendSelected(int index) {// 选中时突出显示相应的 Legend 标签// 获取 Legend 对象Legend legend = barChart.getLegend();// 获取当前 Legend 的条目LegendEntry[] entries = legend.getEntries();for (int i = 0; i < entries.length; i++) {if (i == index) {entries[index].formSize = SELECTED_FORM_SIZE;} else {entries[i].formSize = DEFAULT_FORM_SIZE;}}// 刷新图表barChart.invalidate();}public void resetLegendDefault() {// 获取当前 Legend 的条目// 获取 Legend 对象Legend legend = barChart.getLegend();LegendEntry[] entries = legend.getEntries();for (int i = 0; i < entries.length; i++) {entries[i].formSize = DEFAULT_FORM_SIZE;}barChart.invalidate();}public void setLegendConfig(List<Integer> barColors, String[] legendLabels) {Legend legend = barChart.getLegend();legend.setFormToTextSpace(8f);legend.setStackSpace(16f);legend.setForm(Legend.LegendForm.CIRCLE);legend.setTextSize(14f);YAxis yAxis = barChart.getAxisLeft();float spaceTop = yAxis.getSpaceTop();float spaceBottom = yAxis.getSpaceBottom();float yAxisHeight = yAxis.getAxisMaximum() - spaceTop - spaceBottom;legend.setYEntrySpace(yAxisHeight / (legendLabels.length));legend.setYOffset(spaceTop);legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);legend.setOrientation(Legend.LegendOrientation.VERTICAL);legend.setStackSpace(1f);legend.setDrawInside(false);if (legendLabels != null && legendLabels.length > 0) {List<LegendEntry> legendEntries = new ArrayList<>();for (int i = 0; i < legendLabels.length; i++) {LegendEntry entry = new LegendEntry();entry.label = legendLabels[i];entry.formColor = barColors.get(i);entry.formSize = 10f;legendEntries.add(entry);}legend.setCustom(legendEntries);}}}
}

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

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

相关文章

NET Core发布 HTTP Error 500.31 - Failed to load ASP.NET Core runtime

记录一下踩过的坑&#xff1a; 首先&#xff0c;不论是500.31还是500.30 &#xff0c;首先确保安装了三个文件 1.NET Core RunTime 2.NET SDK 3.NET Hosting 其次&#xff0c;确保三个文件的版本一致&#xff0c;如下&#xff1a; 要装就统一装同一个大版本&#xff0c;不要东…

Ubuntu12.0安装g++过程及其报错

Ubuntu12.0安装g过程及其报错 https://blog.csdn.net/weixin_51286763/article/details/120703953 https://blog.csdn.net/dingd1234/article/details/124029945 2.报错二&#xff1a; [41/80] Building CXX object absl/synchronization/CMakeFiles/graphcycles_internal.di…

VMware Vsphere 日志:用户 dcui@127.0.01已以vMware-client/6.5.0 的身份登录

一、事件截图&#xff1a; 二、解决办法 原因&#xff1a; 三、解决办法 1.开启锁定模式 2.操作 1、从清单中选择您的 ESXi 主机&#xff0c;然后转至管理 > 设置 > 安全配置文件&#xff0c;然后单击锁定模式的编辑按钮 2、在打开的锁定模式窗口中&#xff0c;选中启…

信驰达科技参与《汽车玻璃集成UWB数字钥匙发展研究白皮书》编制工作

为进一步探索汽车数字钥匙技术路线及开发思路&#xff0c;中国智能网联汽车产业创新联盟&#xff08;CAICV&#xff09;、福耀玻璃工业集团股份有限公司联合发起了《汽车玻璃集成UWB数字钥匙发展研究白皮书》研究工作。 2023年12月20日&#xff0c;由中国智能网联汽车产业创新…

C++ 设计模式之桥接模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【简介】什么是桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是⼀种结构型设计模式&#xff0c;它的U…

verilog编程题

verilog编程题 文章目录 verilog编程题序列检测电路&#xff08;状态机实现&#xff09;分频电路计数器译码器选择器加减器触发器寄存器 序列检测电路&#xff08;状态机实现&#xff09; module Detect_101(input clk,input rst_n,input data,o…

基于变换域的模版匹配

模板匹配原理 图像的空间域与其他域之间的变换&#xff0c;如傅里叶变换&#xff0c;小波变换&#xff0c;轮廓波变换&#xff0c;剪切波变换等&#xff0c;实际上是图像在其他坐标领域中的表现。在空间域中&#xff0c;图像的信息是像素值和坐标位置&#xff1b;在其他域中&a…

Spring之AOP源码(二)

书接上文 文章目录 一、简介1. 前文回顾2. 知识点补充 二、ProxyFactory源码分析1. ProxyFactory2. JdkDynamicAopProxy3. ObjenesisCglibAopProxy 三、 Spring AOP源码分析 一、简介 1. 前文回顾 前面我们已经介绍了AOP的基本使用方法以及基本原理&#xff0c;但是还没有涉…

【已解决】c语言const/指针学习笔记

本博文源于笔者正在复习const在左与在右&#xff0c;指针优先级、a,&a,*a的区别。 1、const在左与在右 int const *p const int *p int * const p int const * const p const int * const p* 在const右边&#xff0c;指向的数据不可以改变&#xff0c;可以改变地址 * 在c…

vue2使用 element表格展开功能渲染子表格

默认样式 修改后 样式2 <el-table :data"needDataFollow" border style"width: 100%"><el-table-column align"center" label"序号" type"index" width"80" /><el-table-column align"cent…

中仕公考:2024年度国考笔试分数公布,进面名单已出

2024年度考试录用公务员笔试成绩和合格分数线已经公布&#xff0c;考生们可以自行登录公务员专题网站查询成绩。 进面人员名单根据规定的面试比例&#xff0c;按照笔试成绩从高至低的顺序&#xff0c;1月14日已经公布进面名单。 没有进入面试人员名单的考生可以关注调剂&…

线性调频信号的解线调(dechirp,去斜)处理matlab仿真

线性调频信号的解线调 线性调频信号的回波模型参考信号去斜处理去斜处理傅里叶变换得到脉压结果解线调仿真总结 线性调频信号的回波模型 对于线性调频脉冲压缩雷达&#xff0c;其发射信号为&#xff1a; s ( t ) r e c t ( t T ) e x p ( j π μ t 2 ) \begin{equation} s(…