BarChartManager.java 5.8 KB
package com.yinhebairong.clasmanage.utils;

import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.Legend;
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.formatter.ValueFormatter;

import java.util.ArrayList;
import java.util.List;

public class BarChartManager {
    private BarChart barChart;
    private YAxis leftAxis;   //左边Y轴
    private YAxis rightAxis;  //右边Y轴
    private XAxis xAxis;      //X轴

    public BarChartManager(BarChart mBarChart) {
        this.barChart = mBarChart;
        leftAxis = barChart.getAxisLeft();
        rightAxis = barChart.getAxisRight();
        mBarChart.setViewPortOffsets(150, 20, 100, 200);
        xAxis = barChart.getXAxis();
    }

    private void initBarChart() {
        barChart.getDescription().setEnabled(false);
        barChart.setDrawGridBackground(false);
        barChart.setTouchEnabled(true);  // - > 触摸事件禁用 , 包括放大缩小 还有碰到触发线条标尺
        barChart.setDragEnabled(true);  //  圆圈选中之后的标尺  滑动
        barChart.setScaleEnabled(false);   //  触摸之后放大缩小
        barChart.setPinchZoom(false);
        //XY轴的设置
        //X轴设置显示位置在底部
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setAxisMinimum(0f);
        xAxis.setGranularity(1f);
        //保证Y轴从0开始,不然会上移一点
        leftAxis.setAxisMinimum(0f);
        rightAxis.setAxisMinimum(0f);
        xAxis.setSpaceMin(1f);
        leftAxis.setSpaceMin(1f);
        rightAxis.setSpaceMin(1f);
        xAxis.setDrawGridLines(false);
        xAxis.setLabelRotationAngle(-40);
    }


    private void initBarDataSet(BarDataSet barDataSet, int color, boolean mode) {
        barDataSet.setColor(color); // 柱子的颜色
        barDataSet.setFormLineWidth(1f);
        barDataSet.setFormSize(15.f);
        //不显示柱状图顶部值

    }

    private void setLegend() {
        Legend legend = barChart.getLegend();
        legend.setFormSize(12f); // 图例的图形大小
        legend.setTextSize(15f); // 图例的文字大小
        legend.setDrawInside(false); // 设置图例在图中
        legend.setOrientation(Legend.LegendOrientation.HORIZONTAL); // 图例的方向为垂直
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT); //显示位置,水平右对齐
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); // 显示位置,垂直上对齐
        // 设置水平与垂直方向的偏移量
        legend.setYOffset(55f);
        legend.setXOffset(30f);
    }

    public void ShowBart(List<String> detail, List<Float> xAxisValues, List<Float> yValuses1, List<Float> yValuses2, List<String> labels, List<Integer> colours) {
        initBarChart();
        // y 数据
        ArrayList<BarEntry> yValues = new ArrayList<>();
        // y2 数据
        ArrayList<BarEntry> yValues2 = new ArrayList<>();

        for (int i = 0; i < yValuses1.size(); i++) {
            yValues.add(new BarEntry(i, yValuses1.get(i)));
        }
        for (int x = 0; x < yValuses2.size(); x++) {
            yValues2.add(new BarEntry(x, yValuses2.get(x)));
        }
        BarDataSet barDataSet1 = new BarDataSet(yValues, labels.get(0));
        barDataSet1.setColor(colours.get(0));
        BarDataSet barDataSet2 = new BarDataSet(yValues2, labels.get(1));
        barDataSet2.setColor(colours.get(1));
        barDataSet1.setDrawValues(false);
        barDataSet2.setDrawValues(false);
        BarData data = new BarData(barDataSet1, barDataSet2);
        float groupSpace = 0.06f;
        float barSpace = 0.02f;
        float barWidth = 0.45f;
        // 设置 柱子宽度
        data.setBarWidth(barWidth);
        setXAxis(xAxisValues.get(xAxisValues.size() - 1) + 1, xAxisValues.get(0), xAxisValues.size(), detail);

        data.groupBars(0.0f, groupSpace, barSpace);
        barChart.setData(data);
    }

    /**
     * 设置Y轴值
     *
     * @param max
     * @param min
     * @param labelCount
     */
    public void setYAxis(float max, float min, int labelCount) {
        if (max < min) {
            return;
        }
        leftAxis.setAxisMaximum(max);
        leftAxis.setAxisMinimum(min);
        leftAxis.setLabelCount(labelCount, false);

        rightAxis.setAxisMaximum(max);
        rightAxis.setAxisMinimum(min);
        rightAxis.setLabelCount(labelCount, false);
        barChart.invalidate();
    }

    /**
     * 设置X轴的值
     *
     * @param max
     * @param min
     * @param labelCount
     */
    public void setXAxis(float max, float min, int labelCount, List<String> detail) {
        if (max < min) {
            return;
        }
        xAxis.setAxisMaximum(max);
        xAxis.setAxisMinimum(min);
        xAxis.setLabelCount(labelCount, true);
        ValueFormatter Barformatter = new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                //设置 xAxis.setGranularity(1);后 value是从0开始的,每次加1,

                int v = (int) value;
                if(v==max){
                    String st = detail.get(detail.size()-1);
                    String tim1 = "";
                    tim1 = st;
                    return tim1;
                }else if (v < detail.size() && v >= 0){
                    String st = detail.get(v);
                    String tim1 = "";
                    tim1 = st;
                    return tim1;
                }else {
                    return null;
                }

            }
        };
        xAxis.setValueFormatter(Barformatter);
        barChart.invalidate();
    }

}