Mar*_*506 11 format android date mpandroidchart
背景
对于我的应用程序中的一些图表,我正在使用MPAndroidChart库.我的图表的所有水平轴都是基于时间的,它们可以跨越一整年,一个月,一周,一天或跨越一小时.它总是显示一个完整的周期,所以1月到12月,周一到周日,0:00-24:00等.轴的值始终是纪元时间戳(以秒为单位).
需求
我希望x轴标签遵循以下规则:
问题
我可以设置granularityx轴,这样可以确保两点之间的空间不小于颗粒度,但这可能意味着(在白天的情况下)第一个标签是凌晨1点,第二个标签是在凌晨2:01,第三个是在凌晨3:16,因为它符合(最小)60分钟的粒度.
当前不正确的情况,理想情况下会是这样的 [0:00, 3:00, 6:00, 9:00 ..]
题
有没有办法控制x轴标签的定位,以达到上述结果?
我做过同样的事情,试试看,
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));
Run Code Online (Sandbox Code Playgroud)
在这种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;
}
Run Code Online (Sandbox Code Playgroud)