Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。

MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。

作者头像
Petterp
发布于 2022-02-09 03:16:50
发布于 2022-02-09 03:16:50
1.6K00
代码可运行
举报
文章被收录于专栏:JetPackJetPack
运行总次数:0
代码可运行

MPAndroidChart攻略——BarChart并列柱状图的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事及自定义标签颜色

昨天在比赛中遇到了MP的并列柱状图,看网上对这方面记录并不是很多,所以今天就做一个教程吧。

先看简单的需求草图吧

好了,现在开始上代码,需要特别注意的地方,会重点标出来提醒。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Main2Activity extends AppCompatActivity {
    private BarChart chart;
    private CountDownTimer count;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        chart=findViewById(R.id.chart);
        info();
        count=new CountDownTimer(Integer.MAX_VALUE,2000) {
            @Override
            public void onTick(long millisUntilFinished) {
                setData();
            }

            @Override
            public void onFinish() {

            }
        }.start();
    }
  
    private void info(){
        XAxis xAxis=chart.getXAxis();
        xAxis.setDrawGridLines(false);
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setLabelCount(5);
        //设置x轴最小值
        xAxis.setAxisMinimum(0f);
        //设置x轴最大值
        xAxis.setAxisMaximum(5f);
        final String[] data={"周一","周二","周三","周四","周五"};
        //标签居中
        xAxis.setTextSize(25f);
        xAxis.setCenterAxisLabels(true);
        //自定义x轴
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float v, AxisBase axisBase) {
                return data[(int) Math.abs(v%5)];
            }
        });

        YAxis left=chart.getAxisLeft();
        left.setAxisMinimum(0f);
        left.setAxisMaximum(6f);
        left.setLabelCount(6);
        //设置字体大小
        left.setTextSize(25f);
        //设置y轴左侧竖线宽度 不设置在自定义标签时会出现不显示竖线的情况
        left.setAxisLineWidth(1f);
        //隐藏Y轴左侧网格线
        left.setDrawGridLines(false);
        final String[] setY={"","畅通","缓行","拥堵","一般拥堵","严重拥堵"};
        left.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float v, AxisBase axisBase) {
                return v>=6?"":setY[(int) v];
            }
        });

        YAxis right=chart.getAxisRight();
        right.setDrawGridLines(false);
        right.setAxisMinimum(0f);
        right.setTextSize(25f);
        right.setAxisMaximum(5f);

        //设置图表编译,避免x轴标签显示不全
        chart.setExtraBottomOffset(10);
        //禁用图例
        chart.getLegend().setEnabled(false);
        //禁用描述
        chart.getDescription().setEnabled(false);
    }

    private void setData(){
        List<BarEntry> list1=new ArrayList<>();
        List<BarEntry> list2=new ArrayList<>();
        List<BarEntry> list3=new ArrayList<>();
        for (int i=0;i<5;i++){
            list1.add(new BarEntry(i, (float) (Math.random()*5)));
            list2.add(new BarEntry(i, (float) (Math.random()*5)));
            list3.add(new BarEntry(i, (float) (Math.random()*5)));
        }
        BarDataSet set1=new BarDataSet(list1,"");
        BarDataSet set2=new BarDataSet(list2,"");
        BarDataSet set3=new BarDataSet(list3,"");
        set1.setColor(Color.RED);
        set2.setColor(Color.BLUE);
        set3.setColor(Color.GREEN);

        BarData data=new BarData(set1,set2,set3);
        //组内柱状图之间的空间
        float barspace=0.05f;
        //每组之间的空间
        float groupspcae=0.3f;
        //柱状图的宽度
        float barWidth=(1-0.3f-0.05f*3)/3;
        //设置柱状图的宽度
        data.setBarWidth(barWidth);
        //(起始点,组间隔,组内间隔)
        data.groupBars(0f,groupspcae,barspace);

        //上面的计算公式为  图组间隔+(柱状图间隔*柱状图个数)+子柱状图宽度*每组柱状图个数=1f
        //简单计算为  子柱状图宽度=(1f-图组间隔-(柱状图间隔*柱状图个数))/每组柱状图个数

        //设置
        chart.setData(data);
        //刷新布局
        chart.invalidate();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (count != null) {
            count.cancel();
            count=null;
        }
    }
}

看看实际效果图

现在,我们来实现如何点击隐藏相应的条目。

思路是这样的,这里感谢我的工作室同学,简单又粗暴:

点击相应的按钮,设置相应的柱状图颜色为白色。算一种比较投巧的办法吧。

我当时的想法是,对数据进行保留,然后加上标记位,每次点击,将相应位置的数据改为0,然后刷新布局即可。但是总是List数据改了 ,图表刷新却直接将一组数据全删了,很是纳闷,试了一个上午,都没有找到原因。 如果你们谁有更好的想法,也欢迎说一下

以下细节需要注意: 背景色一定要改为白色,默认的那个背景色并不是纯白,网格线需要禁用,否则效果很是尴尬。 需要隐藏掉标签显示,否则柱状图颜色没了,标签还在,当然也可以通过自定义 标签的显示,将相对应的标签自定义为“”,也可以实现禁用。

4.17号补充,直接更改数据然后刷新布局也可以实现,当时的改错了一个值。

下面开始上代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Main2Activity extends AppCompatActivity implements View.OnClickListener {
    private BarChart chart;
    private CountDownTimer count;
    private BarDataSet set1;
    private BarDataSet set2;
    private BarDataSet set3;
    //标记位
    private boolean mode1 = false, mode2 = false, mode3 = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        chart = findViewById(R.id.chart);
        info();
        //定时器
        count = new CountDownTimer(Integer.MAX_VALUE, 2000) {
            @Override
            public void onTick(long millisUntilFinished) {
                setData();
            }

            @Override
            public void onFinish() {

            }
        }.start();
    }


    private void info() {
        XAxis xAxis = chart.getXAxis();
        xAxis.setDrawGridLines(false);
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setLabelCount(5);
        //设置x轴最小值
        xAxis.setAxisMinimum(0f);
        //设置x轴最大值
        xAxis.setAxisMaximum(5f);
        final String[] data = {"周一", "周二", "周三", "周四", "周五"};
        //标签居中
        xAxis.setTextSize(25f);
        xAxis.setCenterAxisLabels(true);
        //自定义x轴
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float v, AxisBase axisBase) {
                return data[(int) Math.abs(v % 5)];
            }
        });

        YAxis left = chart.getAxisLeft();
        left.setAxisMinimum(0f);
        left.setAxisMaximum(6f);
        left.setLabelCount(6);
        //设置字体大小
        left.setTextSize(25f);
        //设置y轴左侧竖线宽度 不设置在自定义标签时会出现不显示竖线的情况
        left.setAxisLineWidth(1f);
        //隐藏Y轴左侧网格线
        left.setDrawGridLines(false);
        final String[] setY = {"", "畅通", "缓行", "拥堵", "一般拥堵", "严重拥堵"};
        left.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float v, AxisBase axisBase) {
                return v >= 6 ? "" : setY[(int) v];
            }
        });

        YAxis right = chart.getAxisRight();
        right.setDrawGridLines(false);
        right.setAxisMinimum(0f);
        right.setTextSize(25f);
        right.setAxisMaximum(5f);

        //设置图表编译,避免x轴标签显示不全
        chart.setExtraBottomOffset(10);
        //禁用图例
        chart.getLegend().setEnabled(false);
        //禁用描述
        chart.getDescription().setEnabled(false);
        chart.setBackgroundColor(Color.WHITE);

        findViewById(R.id.hide_red).setOnClickListener(this);
        findViewById(R.id.hide_blue).setOnClickListener(this);
        findViewById(R.id.hide_gre).setOnClickListener(this);
    }

     private void setData() {
        List<BarEntry> list1 = new ArrayList<>();
        List<BarEntry> list2 = new ArrayList<>();
        List<BarEntry> list3 = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list1.add(new BarEntry(i, (float) (Math.random() * 5)));
            list2.add(new BarEntry(i, (float) (Math.random() * 5)));
            list3.add(new BarEntry(i, (float) (Math.random() * 5)));
        }
        set1 = new BarDataSet(list1, "");
        set2 = new BarDataSet(list2, "");
        set3 = new BarDataSet(list3, "");
        setHide(mode1, set1, Color.RED);
        setHide(mode2, set2, Color.BLUE);
        setHide(mode3, set3, Color.GREEN);
        BarData data = new BarData(set1, set2, set3);
        //组内柱状图之间的空间
        float barspace = 0.05f;
        //每组之间的空间
        float groupspcae = 0.3f;
        //柱状图的宽度
        float barWidth = (1 - 0.3f - 0.05f * 3) / 3;
        //设置柱状图的宽度
        data.setBarWidth(barWidth);
        //(起始点,组间隔,组内间隔)
        data.groupBars(0f, groupspcae, barspace);

        //上面的计算公式为  图组间隔+(柱状图间隔*柱状图个数)+子柱状图宽度*每组柱状图个数=1f
        //简单计算为  子柱状图宽度=(1f-图组间隔-(柱状图间隔*柱状图个数))/每组柱状图个数

        //设置
        chart.setData(data);
        //刷新布局
        chart.invalidate();
    }


    //设置柱状图颜色为白色
    private void setHide(boolean mode, BarDataSet set, int color) {
        if (mode) {
            set.setColor(Color.WHITE);
        } else {
            set.setColor(color);
        }
        set.setDrawValues(false);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.hide_red:
                mode1 = true;
                set1.setColor(Color.WHITE);
                chart.invalidate();
                break;
            case R.id.hide_blue:
                mode2 = true;
                set2.setColor(Color.WHITE);
                chart.invalidate();
                break;
            case R.id.hide_gre:
                mode3 = true;
                set3.setColor(Color.WHITE);
                chart.invalidate();
                break;
        }
    }

  @Override
    protected void onDestroy() {
        super.onDestroy();
        if (count != null) {
            count.cancel();
            count = null;
        }
    }

}

效果就是这样。如果有更好的解决方案,也欢迎大家告诉我。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MPAndroidChart_水平条形图的那些事
水平条形图?也就是倒起来的柱状图,简单理解可以为,将正常的图表顺时针旋转90度,其x轴,y轴对应关系如下。
Petterp
2022/02/09
1.9K0
MPAndroidChart_水平条形图的那些事
Android——MPAndroidChart折线图/柱状图/饼形图的使用
【背景】:项目中需要使用到图表,于是找了目前非常热门的开源图表,折线图/柱状图/饼图等应有尽有,各种效果实现都很给力,附上github链接,有原DEMO,github是最好的老师,看DEMO例程源码,相比在网上泛泛的查资料要高效的多。https://github.com/PhilJay/MPAndroidChart
Winter_world
2020/09/25
3.6K0
Android——MPAndroidChart折线图/柱状图/饼形图的使用
android详解_MPAndroidChart
首先依赖 1. implementation ‘com.github.PhilJay:MPAndroidChart:v3.0.3’
全栈程序员站长
2022/09/20
1.3K0
android详解_MPAndroidChart
MPAndroidChart_折线图的那些事
看效果还挺不错吧,但是我们实际开发时,往往需求没这么简单,下面,我们来对折线图各种方法进行一个总结。
Petterp
2022/02/09
4K0
MPAndroidChart_折线图的那些事
MPAndroidChart_RadarChart雷达图的那些事
重写这两个类 RadarChart和 XAxisRendererRadarChart。其实也就是更改一个方法,别觉得有什么太困难。
Petterp
2022/02/09
2K0
MPAndroidChart_RadarChart雷达图的那些事
安卓MPAndroidChart绘制柱状图
首先是添加Jar包 进入Gradle Scripts的目录,添加Jar包都在这里 首先是Project这个的allprojects里面加上一行 allprojects { repositories { google() jcenter() maven { url "https://jitpack.io" } } } 在app这个里面denpendencies中弄成这样子的 dependencies { implementat
SingYi
2022/07/14
9790
安卓MPAndroidChart绘制柱状图
Ohos-MPChart——支持多种图表绘制的组件
Ohos-MPChart是OpenAtom OpenHarmony(简称“OpenHarmony”)系统显示各种图表视图的三方组件,用于声明式应用开发,提供了多种多样的图表视图,包括折线图、曲线图、柱形图、饼状图、K线图、雷达图、气泡图。适用于各种统计后的数据以视觉直观的方式呈现。
小帅聊鸿蒙
2025/04/21
1290
Ohos-MPChart——支持多种图表绘制的组件
Android 图表开发开源库MPAndroidChart
图1的效果不是用这个实现的,如果感兴趣可以参考我这篇文章  Android渐变圆环
再见孙悟空_
2023/02/10
2.1K0
Android 图表开发开源库MPAndroidChart
MPAndroidChart_动态柱状图
MPAndroidChart攻略——BarChart的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事 需求:显示最近20条的数据,而且500毫秒秒刷新一次,每次都要求数据最新。 解决办法: 使用List储存,每次存储
Petterp
2022/02/09
1.5K0
MPAndroidChart_动态柱状图
MPchart使用详解及详细属性(一)
项目源代码:https://github.com/libin7278/MpChart
先知先觉
2019/01/21
7.1K0
安卓MPAndroidChart绘制多层级的堆叠条形图
这次是在上一篇的基础上增加的,所以导包这些啥的就跳过了研究了一下代码,发现主要的区别就在于增加data的时候,第二个参数传递的是一个数组,然后就变成了堆叠条形图。
SingYi
2022/07/14
1.3K0
安卓MPAndroidChart绘制多层级的堆叠条形图
MPAndroidChart 之实现底部显示的自定义MarkerView
接到一个需求需要折线图显示数据,权衡利弊后没有自己手绘哦,毕竟怕耽搁时间(或许也是怕写一半写不出来 哈哈哈),所以首选当然是之前接触过的MPAndroidChart,毕竟它很强很强很强。。。
木溪bo
2020/06/22
3.9K0
MPAndroidChart总结
第一天 LineChart的常用属性 lineChart.setDrawBorders(false);//设置绘制边界 lineChart.setDescription("最大值是: "+ max+",最小值是:"+min);// 数据描述 lineChart.setDescriptionTextSize(16f);//数据描述字体大小, 最小值6f, 最大值16f. lineChart.setDescriptionPosition(2500f,50f);//数据描述字体的位置 lineCha
对话、
2022/02/22
1.1K0
MPAndroidChart_饼图的那些事
MPAndroidChart攻略——PieChartt的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事及自定义标签颜色 目录 从简易Demo开始 1. 百分比的设置 2. 标签的设置(标签就是扇形图里的文字) 3. 饼心的设
Petterp
2022/02/09
2.4K0
MPAndroidChart_饼图的那些事
Highcharts-6-柱状图汇总
本文重点介绍的是可视化库Highcharts的相关基础知识,以及如何利用Highcharts来绘制不同场景和需求下的精美柱状图,主要内容包含:
皮大大
2021/03/01
3.3K0
Highcharts-6-柱状图汇总
Highcharts-4-堆叠柱状图
Highcharts-4-柱状图2 本文继续介绍Highcharts中柱状图的制作,主要讲解了3种柱状图的制作: 堆叠柱状图 分组堆叠柱状图 带有百分比堆叠柱状图 垂直堆叠柱状图 效果图 先看下整体的
皮大大
2021/03/01
1.6K0
Highcharts-4-堆叠柱状图
Highcharts快速入门及绘制柱状图
本文重点介绍的是可视化库Highcharts的相关基础知识,以及如何利用Highcharts来绘制不同场景和需求下的精美柱状图,主要内容包含:
皮大大
2021/02/21
3.5K0
Highcharts快速入门及绘制柱状图
Qt | QChart+QChartView+QLineSeries(折线图)+QBarSeries(柱状图)实战
QLineSeries 是 Qt 中的一个类,用于在图表中表示一系列的数据点。它继承自 QAbstractSeries 类,提供了绘制折线图所需的基本功能。
Qt历险记
2024/07/30
1.6K0
Qt | QChart+QChartView+QLineSeries(折线图)+QBarSeries(柱状图)实战
Highcharts-5-属性倾斜、区间变化、多轴柱状图
Highcharts-5-柱状图3 本文中介绍的是3种柱状图相关设置: x轴属性倾斜设置 区间变化柱状图(温度为例) 多轴图形 highcharts保存文件 H.save_file('highchar
皮大大
2021/03/01
2.4K0
Highcharts-5-属性倾斜、区间变化、多轴柱状图
PyQt5可视化 7 饼图和柱状图实操案例 ③柱状图的实现【超详解】
目录 一、柱状图 1 import新模块 2 初始化柱状图和绘制柱状图函数  3 反走样 4 构造函数里添加调用  5 运行效果 1.5.1 全局图 1.5.2 柱状图 二、一步一步画柱状图(draw_barChart函数) 1 最简单的draw_barChart 2 添加标签坐标轴 3 添加数据坐标轴 4 添加平均分作为折线序列 5 添加数据点标签 6 添加标题和图例 7 hovered信号和槽函数 2.7.1 槽函数  2.7.2 关联  2.7.3 运行效果  8 clicked信号和槽函数 2.8.
会洗碗的CV工程师
2023/03/13
2.9K0
PyQt5可视化 7 饼图和柱状图实操案例 ③柱状图的实现【超详解】
推荐阅读
相关推荐
MPAndroidChart_水平条形图的那些事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验