1.MPAndroidChart接入

//MPAndroidChart
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'

2.设置数据加载动画

mBarChart.animateXY(1000, 1000);

首先需要说的是上面这行代码是所有博客和文档里面都提到的,通过该方法可以设置数据加载动画。但是在实际使用过程中你会发现一个问题,就是在测试包(未混淆)过程中一切正常,但是一旦混淆打包使用的时候动画效果并没有出现,但是官方文档也并没有提出有需要混淆的规则。

这种情况下就需要自己添加混淆规则来避免加载动画失效的问题

#MPAndroidChart
-dontwarn com.github.mikephil.**
-keep class com.github.mikephil.**{ *; }

3.设置坐标轴最小值和最大值

使用过程中可能有设置了BarWidth值比较大的时候,导致设置了坐标轴最小值之后,第一条数据的Bar显示不完全。这时候可以通过修改坐标轴的最小值来适应第一条数据的显示。

xAxis.setAxisMinimum(0.7f);

4.自定义轴下标

xAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                return mMonths[((int) value % mMonths.length)];
            }
        });

        leftAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                DecimalFormat mFormat = new DecimalFormat("###,###,##0.00");
                return mFormat.format(value);
            }
        });

网上很多文档中提到的自定义ValueFormatter都是过时不可用的了,需要使用上述的ValueFormatter并重写相应方法来实现自定义

5.自定义柱状图数值

setBarChartData(mList);
                for (IDataSet set : mBarChart.getData().getDataSets()) {
                    set.setDrawValues(true);
                    set.setValueTextColor(getResources().getColor(R.color.color_barchart_value));
                    set.setValueFormatter(new ValueFormatter() {
                        @Override
                        public String getFormattedValue(float value) {
                            DecimalFormat mFormat = new DecimalFormat("###,###,##0.00");
                            return mFormat.format(value);
                        }
                    });
                }
                mBarChart.animateXY(1000, 1000);
                mBarChart.invalidate();

如果想要自定义柱状图上方的数值显示,可以用上述方法来自定义数值的大小,颜色,是否显示,自定义格式等等。记住最后设置完的时候调用invalidate();方法进行刷新操作。

接下来放一个水平柱状图的实例代码仅供参考相关属性设置:

HBarChartActivity.java

public class HBarChartActivity extends BaseAppCompatActivity {

    @BindView(R.id.hBarChart)
    HorizontalBarChart hBarChart;

    @Override
    protected int getLayout() {
        return R.layout.activity_hbarchart;
    }

    @Override
    public void initView() {

        initHBarChart();
    }

    @Override
    public void initEvent() {

    }

    @Override
    public void initData() {

    }


    /**
     * 初始化水平柱形图图控件属性
     */
    private void initHBarChart() {
        //设置阴影
        hBarChart.setDrawBarShadow(false);
        //设置柱状图上数值
        hBarChart.setDrawValueAboveBar(true);
        //不显示描述
        hBarChart.getDescription().setEnabled(false);
        //设置最大显示数量
        hBarChart.setMaxVisibleValueCount(60);
        hBarChart.setPinchZoom(false);
        //是否显示表格颜色
        hBarChart.setDrawGridBackground(false);
        //设置是否可以缩放
        hBarChart.setScaleEnabled(false);
        //设置是否可以触摸
        hBarChart.setTouchEnabled(false);
        //设置是否可以拖拽
        hBarChart.setDragEnabled(false);

        //自定义坐标轴适配器,设置在X轴
        DecimalFormatter formatter = new DecimalFormatter();
        XAxis xl = hBarChart.getXAxis();
        //下标位置
        xl.setPosition(XAxis.XAxisPosition.BOTTOM);
        //设置旋转角度
///        xl.setLabelRotationAngle(-45f);
        // 设置 x 坐标轴 宽度
///        xl.setAxisLineWidth(2f);
        // 设置 x轴 的刻度数量
        xl.setLabelCount(10);
        //是否显示轴线
        xl.setDrawAxisLine(false);
        //是否显示网格线
        xl.setDrawGridLines(false);
        //下标间隔
        xl.setGranularity(1f);
        //文字大小
        xl.setTextSize(20);
        //文字居中
        xl.setCenterAxisLabels(false);
        //最小值(小于文字宽度一半最佳)
        xl.setAxisMinimum(-0.3f);
        //最大值(大于文字宽度一半最佳)
///        xl.setAxisMaximum(3.3f);
        //设置X轴文字自定义适配器
        xl.setValueFormatter(formatter);
        //Y轴左侧隐藏
        hBarChart.getAxisRight().setEnabled(false);
        //Y轴右侧隐藏
        hBarChart.getAxisLeft().setEnabled(false);
        //示例隐藏
        hBarChart.getLegend().setEnabled(false);
        //
        setHBarChartData();
        hBarChart.setFitBars(true);
        hBarChart.invalidate();
        //动画失效可能原因 1.添加混淆文件 2.先调用invalidate方法刷新数据
        hBarChart.animateY(2500);
    }


    /**
     * 设置水平柱形图数据的方法
     */
    private void setHBarChartData() {
        //填充数据,在这里换成自己的数据源
        ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();

        yVals1.add(new BarEntry(0, 4));
        yVals1.add(new BarEntry(1, 2));
        yVals1.add(new BarEntry(2, 6));
        yVals1.add(new BarEntry(3, 1));
        yVals1.add(new BarEntry(4, 9));
        yVals1.add(new BarEntry(5, 4));
        BarDataSet set1;

        if (hBarChart.getData() != null &&
                hBarChart.getData().getDataSetCount() > 0) {
            set1 = (BarDataSet) hBarChart.getData().getDataSetByIndex(0);
            set1.setValues(yVals1);
            hBarChart.getData().notifyDataChanged();
            hBarChart.notifyDataSetChanged();
        } else {
            //图例颜色示意
            set1 = new BarDataSet(yVals1, "DataSet 1");
            set1.setColors(ColorTemplate.LIBERTY_COLORS);
            set1.setDrawIcons(false);

            ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
            dataSets.add(set1);

            BarData data = new BarData(dataSets);
            data.setValueTextSize(10f);
            data.setBarWidth(0.6f);

            hBarChart.setData(data);
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // TODO: add setContentView(...) invocation
        ButterKnife.bind(this);
    }


    public class DecimalFormatter extends ValueFormatter {
        private DecimalFormat format;

        public DecimalFormatter() {
            format = new DecimalFormat("###,###,##0.00");
        }

        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return format.format(value) + "$";
        }
    }

}

布局文件activity_hbarchart.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.github.mikephil.charting.charts.HorizontalBarChart
        android:id="@+id/hBarChart"
        android:layout_width="500dp"
        android:layout_height="300dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>