Android 浅谈 MPAndroidChart 坐标轴设置为字符串的方法

一、问题背景

        最近在做项目,然后项目当中的一个要求是需要实现横坐标坐标值为字符串(因为后端给的时间的数据就是转成字符串的格式发过来的)、纵坐标为数字,众所周知,在 MPAndroidChart 中默认的坐标轴的坐标值都是 float 类型的,所以我上网进行了相关资料的查询并进行了相关的试验,最后完成的效果大致如下。

        因为项目还在数据测试阶段,数据量较少,所以看起来可能不是特别好看,同时我是设置纵轴默认取给定的数据中的最小值的,这样可以让图表画出来后起伏变化更加的清晰。

Android 浅谈 MPAndroidChart 坐标轴设置为字符串的方法

二、解决方案

1、直接创建一个格式化工具类,让他继承 IAxisValueFormatter 这个基类,然后重写它的 getFormattedValue() 方法(可以直接把这段代码贴过去使用)。

public class XAxisValueFormatter implements IAxisValueFormatter {

    private final String[] mLabels;
    public XAxisValueFormatter(String[] labels) {
        mLabels = labels;
    }
    @Override
    public String getFormattedValue(float value, AxisBase axis) {
        try {
            return mLabels[(int) value];
        } catch (Exception e) {
            e.printStackTrace();
            return mLabels[0];
        }
    }
}

 2、创建一个字符串数组,将坐标值的字符串赋值给字符串数组备用(为了防止混乱,无关逻辑删掉了)。

        String[] str = new String[chartData.size()];

        for(int i = 0; i < chartData.size(); i++){

            bean = chartData.get(i);
            str[i] = bean.getTime();
        }

3、然后通过遍历,将字符串对应的下标和另一个坐标轴的 float 数据(这里另一个坐标轴的 float 数据就是 bean.getPresent_students())对应的存储到 Entry 中,然后再存储到列表中。

        for(int i = 0; i < chartData.size(); i++){

            bean = (TimeAndNumberOfPeopleBean)chartData.get(i);
            chartDataList.add(new Entry(i, bean.getPresent_students()));
        }

4、最后再将咱们新创建的格式化工具类赋值给字符串坐标值所在的坐标轴,就大功告成了。

        XAxis xAxis = lineChart.getXAxis();
        XAxisValueFormatter labelFormatter = new XAxisValueFormatter(str);
        xAxis.setValueFormatter(labelFormatter);

三、有关拓展

       之后我又遇到了关于后端传来的数据类型为 float 类型得数据,但是显示得数据要求得格式是百分数形式得,那怎么解决这个问题呢。这个问题得解决方法相对来说简单一些,只需要设置一个默认得格式化标准类,然后这次直接设置给坐标轴就可以了。

//格式化标准类
public class PercentageAxisValueFormatter implements IAxisValueFormatter {

    private DecimalFormat mFormat;

    @RequiresApi(api = Build.VERSION_CODES.N)
    public PercentageAxisValueFormatter(){
        mFormat = new DecimalFormat("0.0");
    }

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    public String getFormattedValue(float value, AxisBase axis) {
         return mFormat.format(value * 100) + "%";
    }
}

//将格式化标准设置给坐标轴
PercentageAxisValueFormatter yAxisValueFormatter = new PercentageAxisValueFormatter();
yAxis.setValueFormatter(yAxisValueFormatter);