2016-11-25 129 views
6

背景MPAndroidChart x轴的日期/时间标签格式化

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

要求

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

  • 跨度的情况下本月 1日;
  • 跨度的情况下开始天的;
  • 任何整小时(##:00)(不是全部)在天的情况下跨度;
  • 任何5分钟点上小时范围。

问题

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

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

Example of current situation

问题

有没有办法来控制x轴标签的定位,实现上述结果?

回答

3

我做同样的事情,你的情况试试这个,

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

+0

如果我错了,请纠正我,但这不只是改变显示值,而不是标签的实际位置。它显示正确的值,但在(稍微)不正确的位置。 – Marcel50506

+0

@ Marcel50506你能告诉我,如果这个反应对你有用吗? – MeknessiHamida

+0

@MeknessiHamida:不,它没有解决我的问题。正如我以前的评论所说,它没有设置标签的正确位置。 – Marcel50506

0

我也有类似的问题,用一周的天...

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

我将我的时间戳以毫秒到时间戳以分钟为单位,而现在它完美

检查浮充转换没有与精度搞乱,并从那里你可以把params的休息即会让你的间隔定期