2016-11-25 2 views
6

HintergrundMPAndroidChart x-Achsen-Datum/Zeit-Label Formatierung

Für einige Charts in meiner app, ich bin mit der MPAndroidChart Bibliothek. Alle horizontalen Achsen meiner Diagramme sind zeitbasiert, sie können sich über ein ganzes Jahr, einen Monat, eine Woche, einen Tag oder eine Stunde erstrecken. Es zeigt immer eine volle Periode, also Januar-Dezember, Montag-Sonntag, 0:00 - 24:00 usw. Der Wert der Achse ist immer der Epochen-Zeitstempel (in Sekunden).

Anforderung

möchte ich die x-Achsenbeschriftungen diese Regeln befolgen:

  • bei 1. des Monats bei Jahr Spanne;
  • bei Tagesbeginn bei Monat oder Woche Spanne;
  • auf alle volle Stunde (##: 00) (nicht perse alle) im Falle eines Tag span;
  • auf jedem 5 Minuten Punkt auf einer Stunde span.

Problem

kann ich die granularity der x-Achse festgelegt, die es dafür sorgt, zwischen zwei Punkten nicht weniger Raum ist dann die Granularität sagt, aber das, dass (bei Tag bedeuten kann span) das erste Etikett ist um 1:00 Uhr, das zweite um 2:01 Uhr und das dritte um 3:16 Uhr, da dies eine Granularität von (mindestens) 60 Minuten entspricht.

Aktuelle falsche Situation, die im Idealfall so etwas wie [0:00, 3:00, 6:00, 9:00 ..]

Example of current situation

Frage

Gibt es eine Möglichkeit, die Positionierung der X-Achsenbeschriftungen zu steuern sein würde, die obigen Ergebnisse zu erzielen ?

Antwort

3

ich gleiche getan haben, versuchen Sie dies,

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)); 

in diesem range in Ihrem Fall. Wenn Sie Monat wollen, dann ist es 12, bei Woche 7 usw.

in interval passieren Sie 1.

in slot Sie passieren müssen, die Identifizierung Ihrer Daten wie Monat, Jahr, Tag, ich habe Verwenden Sie enum dafür.

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; 
} 

See: http://prntscr.com/dbn62x

+0

Bitte korrigieren Sie mich, wenn ich falsch liege, aber dies nicht nur die Anzeigewerte ändern, und nicht die tatsächliche Position der Etiketten. Es zeigt die korrekten Werte, aber an (leicht) falschen Stellen. – Marcel50506

+0

@ Marcel50506 Können Sie mir bitte sagen, ob diese Antwort für Sie funktioniert hat? – MeknessiHamida

+0

@MeknessiHamida: Nein, es hat mein Problem nicht gelöst. Wie in meinem vorherigen Kommentar erwähnt, wird nicht die korrekte Position der Labels festgelegt. – Marcel50506

0

ich mit Tagen der Woche ein ähnliches Problem hatte ...

Meine Zeitstempel hatten das gleiche Format wie deins, aber wenn sie für die Einträge in Floats umgewandelt wurden, verloren sie zu viel Präzision und gaben mir unregelmäßige Intervalle.

umgewandelt ich meine Zeitstempel in Millis zu Zeitstempeln in Minuten, und es funktioniert jetzt perfekt

prüfen, ob der Schwimmer Umwandlung nicht mit Präzision durcheinander, und von dort aus können Sie den Rest der params gesetzt, dass wird Machen Sie Ihre Intervalle regelmäßig