2016-11-25 14 views
6

पृष्ठभूमिMPAndroidChart x- अक्ष दिनांक/समय लेबल

कुछ चार्ट के लिए मेरे एप्लिकेशन में

स्वरूपण, मैं MPAndroidChart लाइब्रेरी का उपयोग कर रहा हूँ। मेरे ग्राफ के सभी क्षैतिज अक्ष 'समय आधारित हैं, वे एक पूर्ण वर्ष, एक महीने, एक सप्ताह, एक दिन या एक घंटे तक फैल सकते हैं। यह हमेशा पूर्ण अवधि दिखाता है, इसलिए जनवरी-दिसंबर, सोमवार-रविवार, 0:00 - 24:00 इत्यादि। धुरी का मूल्य हमेशा युग-टाइमस्टैम्प (सेकेंड में) होता है।

आवश्यकता

मैं इन नियमों का पालन करने के लिए एक्स-अक्ष लेबल हैं:

  • पर साल अवधि के मामले में माह के 1;
  • माह या सप्ताह अवधि के मामले में दिन के शुरू में; पूर्ण घंटे (##: 00) (सभी को पर्स नहीं) दिन अवधि के मामले में;
  • किसी भी 5 मिनटघंटे अवधि पर बिंदु।

समस्या

मैं जो यकीन है कि दो अंक तो विवरण के स्तर को कहते हैं के बीच कोई कम जगह नहीं है बनाता है x- अक्ष, की granularity सेट कर सकते हैं, लेकिन यह है कि इसका मतलब यह कर सकते हैं (दिन के मामले में अवधि) पहला लेबल 1:00 बजे है, और दूसरा 2:01 बजे है और तीसरा 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 में

प्रयास करें। आप महीने चाहते हैं तो वहाँ interval में सप्ताह के 7 आदि

के मामले में 12 है, तो आप slot में 1.

पारित आप पारित करने के लिए, महीने, साल, दिन की तरह अपने डेटा की पहचान, मेरे पास है है इसके लिए enum का उपयोग करें।

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

@ मार्सेल 50506 क्या आप मुझे बता सकते हैं कि यह प्रतिक्रिया आपके लिए काम करती है? – MeknessiHamida

+0

@MeknessiHamida: नहीं, यह मेरी समस्या का समाधान नहीं किया। जैसा कि मेरी पिछली टिप्पणी में कहा गया है, यह लेबल के सही स्थान को सेट नहीं करता है। – Marcel50506

0

मैं सप्ताह के दिनों के साथ एक समान समस्या थी ...

मेरी टाइमस्टैम्प आपकी तरह के प्रारूप में थीं, लेकिन जब उन्हें प्रविष्टियों के लिए फ्लोट में परिवर्तित कर दिया गया था, तो वे बहुत अधिक सटीकता खो देंगे और मुझे अनियमित अंतराल देंगे।

मैं मिनट में timestamps को मिली सेकंड में मेरी टाइम स्टांप परिवर्तित, और अब यह पूरी तरह से काम करता है

जाँच लें कि नाव रूपांतरण अपने परिशुद्धता के साथ खिलवाड़ नहीं कर रहा है, और वहाँ से आप पैरामीटर के बाकी सेट कर सकते हैं कि होगा अपने अंतराल नियमित रूप से

संबंधित मुद्दे