Android最火的框架系列(十三)MpAndroidChart

这篇具有很好参考价值的文章主要介绍了Android最火的框架系列(十三)MpAndroidChart。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    本系列篇主要介绍下Android非常火爆的三方图表库MpAndroidChart的使用。可能在大多数情况下,我们很少会在Android端去开发图表,一般情况下图表都会在PC端用H5去展示。但如果说做一些金融财经类、工厂类、统计类、大数据类等的app,肯定会涉及到到数据可视化分析,那么你绝对会用到MpAndroidChart。

目录

一、前言

二、最强实践攻略​​​​​​​

三、MpAndroidChart支持的图表类型

四、柱形图

1、单组柱状图

2、多组柱状图


一、前言

    2018年,那年的我还没进入互联网。当时开发一个大数据平台项目,因此调研了Android端主流的图表三方库。其中,包括功能强大的MpAndroidChart、使用简单且体积较小的HelloCharts,以及在web前端非常火的Echarts。

    回到2023年的今天,我们再次去github瞄一眼。以当前github的star数来看,Echarts仍然是最强大的图表库,支持的图表种类也是最丰富的。然而由于Echarts不是NA的,在Android端使用并不方便。当然这不代表无法使用,我们可以让前端同学做一个H5页面,在WebView中去加载h5页面间接使用它。

android mpandroidchart,Android三方框架,android

android mpandroidchart,Android三方框架,android

android mpandroidchart,Android三方框架,android

    作为Android端的开发同学,既然我们可以NA来实现,那就不要考虑h5这种方式了。 其实绝大多数情况下,客户端展示的图表不会太花里胡哨,MpAndroidChart完全可以满足我们的诉求。

二、最强实践攻略​​​​​​​

    2018年我调研和使用MpAndroidChart3的时候,就发现了一些问题。而这些问题我通过查阅网上的资料,根本没发解决,其中不乏一些错误或片面的说法。我称该篇为MpAndroidChart最强实践攻略。

当前网上90%资料是MpAndroidChart2的,MpAndroidChart3跟MpAndroidChart2差别非常大,而本系列攻略基于最新的MpAndroidChart3。

当前网上资料,都是复制粘贴,有很多的错误,比较经典的就是多组柱状图的分组问题,而本系列会整理MpAndroidChart3常见问题。 

三、MpAndroidChart支持的图表类型

    MpAndroidChart除支持常见的柱状图(BarChart)、折线图(LineChart)、饼形图(PieChart)外,还支持例如散点图(ScatterChart)、K线图(CandleStickChart)、气泡图(BubbleChart)、雷达图(RadarChart)等,并且支持例如柱状图和折线图的组合图。

android mpandroidchart,Android三方框架,android

android mpandroidchart,Android三方框架,android

android mpandroidchart,Android三方框架,android

android mpandroidchart,Android三方框架,android

android mpandroidchart,Android三方框架,android

    以上是对MpAndroidChart3的系统介绍,通过官方的一些示例来看,MpAndroidChart3的功能还是非常强大的。接下来通过对MpAndroidChart3的一些实战编码,来完整的总结MpAndroidChart3。

四、柱形图

    什么是柱形图?简单来讲,就是那种一个柱一个柱组成的图。真是听君一席话,如听一席话。。。看下百度百科的官方解释:

柱形图,又称长条图、柱状统计图条图条状图棒形图,是一种以长方形的长度为变量的统计图表。

1、单组柱状图

    从百度图片随便搜了个柱形图,长这样,应该是统计七大洲平均海拔高度的柱形图,那我们接下来基于MpAndroidChart的BarChart去实现一样的效果。

android mpandroidchart,Android三方框架,android

    首先,这是单柱的简单柱形图,数据源比较简单,就是一组七大洲的海拔高度数据,那我们直接按照api设置一下就好了。

/**
     * 设置数据源
     */
    private void setData() {
        List<BarEntry> barEntries = new ArrayList<>();
        barEntries.add(new BarEntry(0,1500));
        barEntries.add(new BarEntry(1,500));
        barEntries.add(new BarEntry(2,1500));
        barEntries.add(new BarEntry(3,2000));
        barEntries.add(new BarEntry(4,1000));
        barEntries.add(new BarEntry(5,500));
        barEntries.add(new BarEntry(6,1));

        BarDataSet barDataSet = new BarDataSet(barEntries,"标题一");
        BarData ba = new BarData(barDataSet);
        mBarChart.setData(ba);
    }

    效果长这样,非常原始的风格,看上去乱糟糟的,非常糟糕: 

android mpandroidchart,Android三方框架,android

     如果我们不对柱形图去做一些UI的设置,那么默认的效果是比较粗犷且不美观的。因此,接下来我们一步步去美化这个柱形图。

1、为不同的柱设置不同的颜色

    /**
     * 设置数据源
     */
    private void setData() {
        List<BarEntry> barEntries = new ArrayList<>();
        barEntries.add(new BarEntry(0,1500));
        barEntries.add(new BarEntry(1,500));
        barEntries.add(new BarEntry(2,1500));
        barEntries.add(new BarEntry(3,2000));
        barEntries.add(new BarEntry(4,1000));
        barEntries.add(new BarEntry(5,500));
        barEntries.add(new BarEntry(6,1));

        BarDataSet barDataSet = new BarDataSet(barEntries,"标题一");

        // 设置颜色
        List<Integer> colors = new ArrayList<>();
        colors.add(Color.GRAY);
        colors.add(Color.GREEN);
        colors.add(Color.BLUE);
        colors.add(Color.RED);
        colors.add(Color.YELLOW);
        colors.add(Color.CYAN);
        colors.add(Color.BLACK);

        barDataSet.setColors(colors);
        BarData ba = new BarData(barDataSet);
        mBarChart.setData(ba);
    }

2、设置柱形图的样式

    private void initUI(){
        // 不显示图例
        mBarChart.getLegend().setEnabled(false);
        // 不显示描述
        mBarChart.getDescription().setEnabled(false);
        // 左右空出barWidth/2,更美观
        mBarChart.setFitBars(true);
        // 不绘制网格
        mBarChart.setDrawGridBackground(false);

        XAxis xAxis = mBarChart.getXAxis();
        // 设置x轴显示在下方
        xAxis.setPosition(XAxisPosition.BOTTOM);
        // 设置x轴不画线
        xAxis.setDrawGridLines(false);
        // 设置自定义的ValueFormatter
        String[] labels = {"北美洲","南美洲","欧洲","亚洲","大洋洲","非洲","南极洲"};
        xAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                int index = (int) value;
                return labels[index];
            }
        });

        // 设置左y轴
        YAxis yAxis = mBarChart.getAxisLeft();
        // 设置y-label显示在图表外
        yAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);
        // Y轴从0开始,不然会上移一点
        yAxis.setAxisMinimum(0f);
        // 设置y轴不画线
        yAxis.setDrawGridLines(false);
        // 不显示右y轴
        YAxis rightAxis = mBarChart.getAxisRight();
        rightAxis.setEnabled(false);
    }

     优化后,新的柱形图长这样:

android mpandroidchart,Android三方框架,android

2、多组柱状图

    上面的例子是非常简单的柱状图,接下来,我们绘制如下一个柱状图:描述2022年Q1-Q4四家企业苹果、微软、亚马逊、谷歌的收入情况的柱状图。分三步走:

1、初始化数据源

    private void setChartData() {

        List<BarEntry> barEntries1 = new ArrayList<>();
        barEntries1.add(new BarEntry(0, 1500));
        barEntries1.add(new BarEntry(1, 1400));
        barEntries1.add(new BarEntry(2, 800));
        barEntries1.add(new BarEntry(3, 2000));
        BarDataSet barDataSet1 = new BarDataSet(barEntries1, "Q1");

        List<BarEntry> barEntries2 = new ArrayList<>();
        barEntries2.add(new BarEntry(0, 1000));
        barEntries2.add(new BarEntry(1, 1200));
        barEntries2.add(new BarEntry(2, 1500));
        barEntries2.add(new BarEntry(3, 900));
        BarDataSet barDataSet2 = new BarDataSet(barEntries2, "Q2");

        List<BarEntry> barEntries3 = new ArrayList<>();
        barEntries3.add(new BarEntry(0, 900));
        barEntries3.add(new BarEntry(1, 1000));
        barEntries3.add(new BarEntry(2, 1200));
        barEntries3.add(new BarEntry(3, 1500));
        BarDataSet barDataSet3 = new BarDataSet(barEntries3, "Q3");

        List<BarEntry> barEntries4 = new ArrayList<>();
        barEntries4.add(new BarEntry(0, 1400));
        barEntries4.add(new BarEntry(1, 800));
        barEntries4.add(new BarEntry(2, 1000));
        barEntries4.add(new BarEntry(3, 500));
        BarDataSet barDataSet4 = new BarDataSet(barEntries4, "Q4");

        List<Integer> colors = new ArrayList<>();
        colors.add(Color.GREEN);
        colors.add(Color.BLUE);
        colors.add(Color.RED);
        colors.add(Color.YELLOW);

        barDataSet1.setColor(colors.get(0));
        barDataSet2.setColor(colors.get(1));
        barDataSet3.setColor(colors.get(2));
        barDataSet4.setColor(colors.get(3));

        List<IBarDataSet> barDataSets = new ArrayList<>();
        barDataSets.add(barDataSet1);
        barDataSets.add(barDataSet2);
        barDataSets.add(barDataSet3);
        barDataSets.add(barDataSet4);

        BarData ba = new BarData(barDataSets);
        mBarChart.setData(ba);
    }

2、初始化公共UI

    private void updateCommonUI(){
         // 不显示图例
        mBarChart.getLegend().setEnabled(false);
        // 不显示描述
        mBarChart.getDescription().setEnabled(false);
        // 不绘制网格
        mBarChart.setDrawGridBackground(false);
        mBarChart.setScaleYEnabled(false);
        mBarChart.setScaleXEnabled(false);
        mBarChart.setScaleEnabled(false);
        // 设置左y轴
        YAxis yAxis = mBarChart.getAxisLeft();
        // 设置y-label显示在图表外
        yAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);
        // Y轴从0开始,不然会上移一点
        yAxis.setAxisMinimum(0f);
        // 设置y轴不画线
        yAxis.setDrawGridLines(false);
        // 不显示右y轴
        YAxis rightAxis = mBarChart.getAxisRight();
        rightAxis.setEnabled(false);
    }

3、初始化图表UI

    private void updateChartUI() {
        String[] labels = {"Q1", "Q2", "Q3", "Q4"};
        XAxis xAxis = mBarChart.getXAxis();
        // 设置自定义的ValueFormatter
        xAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                int index = (int) value;
                // 注意不要数组越界
                if (index >= 0 && index < labels.length) {
                    return labels[index];
                }
                return "";
            }
        });
        // 设置x轴显示在下方
        xAxis.setPosition(XAxisPosition.BOTTOM);
        // 设置x轴不画线
        xAxis.setDrawGridLines(false);
        // 设置x轴标签从0开始
        xAxis.setAxisMinimum(0);
        // 设置x轴显示的最大标签数量
        xAxis.setAxisMaximum(labels.length);
        // x轴标签居中
        xAxis.setCenterAxisLabels(true);
        // 接下来这段代码尤其重要,网上几乎99%的资料说的都是错的,这里详解一下
        // 1、要想标签跟group中间对齐,必须保证:(barWidth + barSpace) * group + groupSpace = granularity
        // 2、granularity < 1,则右边会有空余;
        // 3、granularity = 1,则刚好在一个屏幕显示开;
        // 4、granularity > 1,则一个屏幕显示不开;
        float barSpace = 0.025f;
        float groupSpace = 0.1f;
        float barWidth = 0.2f;
        float granularity = (barWidth + barSpace) * labels.length + groupSpace;
        xAxis.setGranularity(granularity);
        mBarChart.setScaleX(granularity);
        mBarChart.getBarData().setBarWidth(barWidth);
        mBarChart.groupBars(0, groupSpace, barSpace);
    }

    我在代码里有一大串非常重要的注释,正如我前文所说,关于多组柱状图的分组问题,网上的资料都是错的,我在这里再次拎出来,大家务必理解核心的代码:

// 接下来这段代码尤其重要,网上几乎99%的资料说的都是错的,这里详解一下
// 1、要想标签跟group中间对齐,必须保证:(barWidth + barSpace) * group + groupSpace = granularity
// 2、granularity < 1,则右边会有空余;
// 3、granularity = 1,则刚好在一个屏幕显示开;
// 3、granularity > 1,则一个屏幕显示不开;
float barSpace = 0.025f;
float groupSpace = 0.1f;
float barWidth = 0.2f;
float granularity = (barWidth + barSpace) * labels.length + groupSpace;
xAxis.setGranularity(granularity);
mBarChart.setScaleX(granularity);
mBarChart.getBarData().setBarWidth(barWidth);
mBarChart.groupBars(0, groupSpace, barSpace);

好,接下来我们运行看下效果:

android mpandroidchart,Android三方框架,android

    还有点不完美的地方,没有画图例,后续我们一起看下如何添加图例。持续更新中......20230418文章来源地址https://www.toymoban.com/news/detail-619690.html

到了这里,关于Android最火的框架系列(十三)MpAndroidChart的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GitHub上最火的SpringCloud微服务商城系统项目,附全套教程

    ├── mall-admin – 后台管理系统服务 ├── mall-search – 基于Elasticsearch的商品搜索系统服务 ├── mall-portal – 移动端商城系统服务 └── mall-demo – 微服务远程调用测试服务 项目地址及项目教程 ============= 转发+关注,然后私信回复 “源码” 即可获得《项目地址及

    2024年04月11日
    浏览(35)
  • 今年最火的拼团玩法,全民拼购模式,这个点子你可以看看

    什么是全民拼购? “全民拼购”是将“社交电商”与“拼购玩法”结合起来的一种全新的营销模式,它通过更人性化的方式,将商品的销售利益最大化,既能激励消费者参与,又能促进商品的销售,实现“多方共赢”。 全民拼购是“社交电商”和“拼购玩法”结合的商业模

    2024年02月14日
    浏览(27)
  • 【服务治理①】软件架构服务治理的本质,当下最火的微服务到底是什么?利用AIGC学习微服务的第①弹

    治理讲究战术,自顶向下治理的方式、综合统筹的治理、分而治之的思想。服务治理就是治理服务(来自电源《年会不能停》解释名词的方法 😃),属于过程管理,即从服务的启动到服务的进行再到服务的终止期间发生的全生命周期的数据治理、规则管理、数据监控、安全

    2024年04月17日
    浏览(44)
  • 【Android从零单排系列三十三】《Android布局介绍——FrameLayout》

    目录 前言 一 FrameLayout基本介绍 二 FrameLayout使用方法 三 FrameLayout常见属性及方法 四 FrameLayout简单案例 五 总结 小伙伴们,在上文中我们介绍了Android布局AbsoluteLayout,本文我们继续盘点介绍Android开发中另一个常见的布局,帧布局FrameLayout。 FrameLayout是Android中的一种布局容器,

    2024年02月12日
    浏览(28)
  • 【AI绘图 丨 Midjourney 系列教程二】— 初识超火的AI绘画神器Midjourney

    今天起,由 Midjourney 打头阵,让我们开始共同探索一系列的 AI 领域革命性作品,包括 Midjourney、Stable Diffusion、ChatGPT 等等,学习这些新时代的魔法和它的咒语。 写在前面 官方文档是最好的入门课程。 相较于市面上琳琅满目的课程,官方文档通常是学习新技能的首选途径。它

    2024年02月09日
    浏览(46)
  • Oracle系列十三:游标

    Oracle游标(cursor)是一种数据结构,用于在PL/SQL代码中处理结果集,如用于暂时存储SELECT语句返回的结果集。游标允许程序员对结果集进行逐行处理,并在需要时检索或修改数据。当表的数据量很大的时候,不适合使用游标。 使用游标的5个步骤: 声明变量,用于保存SELECT语

    2024年02月07日
    浏览(22)
  • Python工具箱系列(三十三)

    Timescaledb 在物联网时代,出现了大量以时间为中心海量产生的传感器数据,称为时序数据。这类数据的特点是: 数据记录总有一个时间戳。 数据几乎总是追加,不更新也不删除。 大量使用近期的数据。很少更新或者回填时间间隔的缺失数据。 与时间间隔频率关系不大。但累

    2024年02月06日
    浏览(44)
  • 学习Android的第十三天

    目录 Android TextClock 文本时钟控件 TextClock 控件主要属性和方法 简单的 TextClock 参考文档 Android AnalogClock 控件 AnalogClock 属性 Android Chronometer 计时器 Chronometer 属性 Chronometer 主要方法 范例: 完整的计时器 范例: 倒计时 Android TextClock 是一个用于在 Android 应用中显示当前日期和时

    2024年02月19日
    浏览(35)
  • 鸿蒙开发系列教程(二十三)--List 列表操作(2)

    在列表项之间添加间距,可以使用space参数,主轴方向 List({ space: 10 }) { … } 分隔线用来将界面元素隔开,使单个元素更加容易识别。 startMargin和endMargin属性分别用于设置分隔线距离列表侧边起始端的距离和距离列表侧边结束端的距离 List() { … } .divider({ strokeWidth: 1, startMargi

    2024年02月19日
    浏览(69)
  • Java开发基础系列(十三):集合对象(Set接口)

    😊 @ 作者: 一恍过去 💖 @ 主页: https://blog.csdn.net/zhuocailing3390 🎊 @ 社区: Java技术栈交流 🎉 @ 主题: Java开发基础系列(十三):集合对象(Set接口) ⏱️ @ 创作时间: 2023年07月27日 HashSet: 基于哈希表实现的集合,不保证元素的顺序。 LinkedHashSet: 基于哈希表和双向链表实现的

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包