2016-11-25 130 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的休息即會讓你的間隔定期