背景
对于我应用中的一些图表,我使用的是 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:
问题
我可以设置 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 轴日期/时间标签格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!