MPAndroidChart x轴日期/时间标签格式

时间:2016-11-25 10:51:18

标签: android date format mpandroidchart

背景

对于我应用中的某些图表,我正在使用MPAndroidChart库。我的图表的所有水平轴都是基于时间的,它们可以跨越一整年,一个月,一周,一天或跨越一小时。它总是显示一个完整的周期,所以1月 - 12月,周一 - 周日,0:00 - 24:00等。轴的值始终是纪元时间戳(以秒为单位)。

要求

我希望x轴标签遵循以下规则:

    范围内
  • 月份;
  • 一天开始 范围;
  • 在任何整个小时(## 00:00)(不是全部),如果范围;
  • 小时范围内 5分钟点。

问题

我可以设置x轴的granularity,这样可以确保两个点之间没有更小的空间然后粒度说明,但这可能意味着(在白天的情况下)第一个标签是在凌晨1点,第二个在凌晨2:01,第三个在凌晨3:16,因为它符合(最小)60分钟的粒度。

当前不正确的情况,理想情况下会是[0:00, 3:00, 6:00, 9:00 ..]

Example of current situation

问题

有没有办法控制x轴标签的位置以达到上述效果?

2 个答案:

答案 0 :(得分:5)

我做了同样的事,试试这个,

 XAxis xAxis = mChart.getXAxis();
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);
    xAxis.setDrawGridLines(false);
    xAxis.setGranularity(1f); // only intervals of 1 day
    xAxis.setTypeface(mTfLight);
    xAxis.setTextSize(8);
    xAxis.setTextColor(ContextCompat.getColor(this, R.color.colorYellow));
    xAxis.setValueFormatter(new GraphXAxisValueFormatter(range, interval, slot));
在你的情况下,在range

。如果你想要一个月那么就有12个,如果是第7周等等。

interval中传递1。

slot您必须通过,识别您的数据,如月,年,日,我已使用枚举。

public class GraphXAxisValueFormatter implements IAxisValueFormatter {

private static int MINUTES_INTERVAL = 5;
private String[] mValues;
private int mInterval;
private SensorInterval.Interval mSlot;

public GraphXAxisValueFormatter(List<BinSensorData> range, int interval, SensorInterval.Interval slot) {
    mValues = new String[range.size()];
    mInterval = interval;
    mSlot = slot;

    Calendar calendar = Calendar.getInstance();
    for (int i = 0; i < range.size(); i++) {
        calendar.setTimeInMillis(range.get(i).getTime());

        int unroundedMinutes = calendar.get(Calendar.MINUTE);
        int mod = unroundedMinutes % MINUTES_INTERVAL;
        calendar.add(Calendar.MINUTE, mod < 8 ? -mod : (MINUTES_INTERVAL - mod));


        String s = "";

        if (slot.equals(SensorInterval.Interval.HOUR) || slot.equals(SensorInterval.Interval.DAY))
            s = Util.getTimeFromTimestamp(calendar.getTimeInMillis());
        else if (slot.equals(SensorInterval.Interval.WEEK))
            s = Util.getDayFromTimestamp(calendar.getTimeInMillis());
        else if (slot.equals(SensorInterval.Interval.MONTH))
            s = Util.getMonthFromTimestamp(calendar.getTimeInMillis());
        else if (slot.equals(SensorInterval.Interval.YEAR))
            s = Util.getYearFromTimestamp(calendar.getTimeInMillis());


        Util.setLog("Time : "+s);
        mValues[i] = s;
    }
}

@Override
public String getFormattedValue(float value, AxisBase axis) {
    Util.setLog("Value : "+ value);
    if (value % mInterval == 0 && value >= 0) {
        return mValues[(int) value % mValues.length];
    } else
        return "";

}

@Override
public int getDecimalDigits() {
    return 0;
}

请参阅:http://prntscr.com/dbn62x

答案 1 :(得分:1)

我在一周中的几天都有类似的问题......

我的时间戳格式与您的格式相同,但是当它们转换为浮动条目时,它们会失去太多的精确度并给我不规则的间隔。

我用毫秒将我的时间戳转换为时间戳,只需几分钟,现在它完美无缺

检查浮动转换是否不会影响您的精确度,然后您可以设置其余的参数,使您的间隔定期