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

MPAndroidChart x-axis date/time label formatting(MPAndroidChart x 轴日期/时间标签格式)
本文介绍了MPAndroidChart x 轴日期/时间标签格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

背景

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

For some charts in my app, I'm using the MPAndroidChart library. All horizontal axis' of my graphs are time based, they can span a full year, a month, a week, a day or span one hour. It always shows a full period, so January-December, Monday-Sunday, 0:00 - 24:00 etc. The value of the axis is always the epoch-timestamp (in seconds).

要求

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

I want the x-axis labels to follow these rules:

  • 月 1 日(如果是 跨度);
  • 一天的开始,如果是跨度;
  • 在任何整小时 (##:00)(并非全部),如果是跨度;
  • 小时跨度的任何5分钟点上.
  • at 1st of month in case of year span;
  • at start of day in case of month or week span;
  • on any full hour (##:00) (not perse all) in case of a day span;
  • on any 5 minute point on an hour span.

问题

我可以设置 x 轴的 granularity,这样可以确保两点之间的空间不小于粒度所说的,但这可能意味着(在一天跨度的情况下)第一个标签是凌晨 1:00,第二个是凌晨 2:01,第三个是凌晨 3:16,因为这符合(最小)60 分钟的粒度.

I can set the granularity of the x-axis, which makes sure there is no less space between two points then the granularity says, but that can mean that (in case of day span) the first label is at 1:00am, and the second at 2:01am and the third is at 3:16am, since that fits a granularity of (minimum) 60 minutes.

当前不正确的情况,最好是 [0:00, 3:00, 6:00, 9:00 ..]

Current incorrect situation, which would ideally be something like [0:00, 3:00, 6:00, 9:00 ..]

问题

有没有办法控制x轴标签的定位来达到上面的效果?

Is there a way to control the positioning of the x-axis labels to achieve the results above?

推荐答案

我也做过,试试这个,

 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 周等等.

in this range in your case. If you want month then there is 12, in case of week 7 etc.

interval 中你通过了 1.

in interval you pass 1.

slot 你必须通过,识别你的数据,比如月、年、日,我为此使用了枚举.

in slot you have to pass, identification of your data like month, year, day, i have use enum for this.

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

这篇关于MPAndroidChart x 轴日期/时间标签格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How can I use CClistview in COCOS2d Android?(如何在 COCOS2d Android 中使用 CClistview?)
cocos2d-android: how to display score(cocos2d-android:如何显示分数)
Sqlite database not copied from asset folder Android(Sqlite 数据库未从资产文件夹 Android 复制)
SQLite Database Copy Appears Corrupted When Generated by Device and not Emulator(SQLite 数据库副本在由设备而不是模拟器生成时出现损坏)
Android file copy(安卓文件拷贝)
Android how to detect Copy event of Edittext in android(Android如何在android中检测Edittext的Copy事件)