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

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

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


先看简单的需求草图吧


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

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号补充,直接更改数据然后刷新布局也可以实现,当时的改错了一个值。


下面开始上代码

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


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

目录
相关文章
|
4月前
|
监控 Serverless 算法框架/工具
函数计算操作报错合集之选中图中部分后报错,但去掉后可以正常请求,是什么原因
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
4月前
动态黑窗口打印文字404页面源码
动态黑窗口打印文字404页面源码
30 2
vitepress如何配置右上角的小两侧标志,利用nav标签进行修改,右侧边栏如何设置成自动弹出水平框,让原先隐藏的框能够显示出来
vitepress如何配置右上角的小两侧标志,利用nav标签进行修改,右侧边栏如何设置成自动弹出水平框,让原先隐藏的框能够显示出来
scrollIntoView()定位元素显示导致页面上移解决方法?
scrollIntoView()定位元素显示导致页面上移解决方法?
552 0
|
6月前
【word】论文、报告:①插入图表题注,交叉引用②快速插入图表目录③删改后一键更新
【word】论文、报告:①插入图表题注,交叉引用②快速插入图表目录③删改后一键更新
679 0
【分享】下拉选项,远程获取数据,根据条件设置颜色,并按颜色排序
有时候需要用下拉选项来只管展示数据的(库存)剩余情况,我拿宜搭下拉选择组件的颜色属性来做展示(大家可以举一反三)
429 1
|
数据安全/隐私保护 iOS开发 芯片
将任意应用窗口置顶显示,这个工具太强了。
将任意应用窗口置顶显示,这个工具太强了。
Axure RP 9查找属性栏位置简单步骤(以文本框举例)
Axure RP 9查找属性栏位置简单步骤(以文本框举例)
2209 0
Axure RP 9查找属性栏位置简单步骤(以文本框举例)
|
小程序 开发者
小程序__02--navigationBarTitleText配置子页面标题,依旧显示默认标题,子页面配置不显示
navigationBarTitleText配置子页面标题,依旧显示默认标题,子页面配置不显示
|
JavaScript
使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态
使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态
431 0
使用jQuery 中的显示与隐藏动画效果实现折叠下拉菜单的收缩和展开,在页面的列表中有若干项,列表的每项中有一个二级列表,二级列表默认为隐藏状态。点击列表的项,切换二级列表的显示或隐藏状态