2016-11-25 46 views
6

nềnMPAndroidChart trục x ngày/giờ nhãn định dạng

Đối với một số bảng xếp hạng trong ứng dụng của tôi, tôi đang sử dụng thư viện MPAndroidChart. Tất cả trục ngang của biểu đồ của tôi dựa trên thời gian, chúng có thể kéo dài cả năm, một tháng, một tuần, một ngày hoặc khoảng một giờ. Nó luôn luôn cho thấy một khoảng thời gian đầy đủ, do đó, tháng một-tháng mười hai, thứ hai-chủ nhật, 0:00 - 24:00 vv. Giá trị của trục luôn luôn là epoch-timestamp (tính bằng giây).

Yêu cầu

Tôi muốn các nhãn trục x làm theo các quy tắc:

  • tại ngày 1 tháng trong trường hợp năm tuổi;
  • tại bắt đầu ngày trong trường hợp tháng hoặc tuần tuổi;
  • trên bất kỳ toàn bộ giờ (##: 00) (không phải tất cả) trong trường hợp ngày span;
  • trên bất kỳ 5 phút điểm trên giờ span.

Vấn đề

tôi có thể thiết lập các granularity của trục x, mà làm cho chắc chắn không có ít khoảng trống giữa hai điểm thì granularity nói, nhưng điều đó có nghĩa là (trong trường hợp của ngày span) nhãn đầu tiên là lúc 1:00 sáng, và nhãn thứ hai lúc 2:01 sáng và thứ ba là lúc 3:16 sáng, vì nó phù hợp với độ chi tiết (tối thiểu) 60 phút.

tình hình không chính xác hiện tại, mà lý tưởng sẽ là một cái gì đó giống như [0:00, 3:00, 6:00, 9:00 ..]

Example of current situation

Câu hỏi

Có cách nào để kiểm soát vị trí của các nhãn trục x để đạt được kết quả trên ?

Trả lời

3

Tôi đã làm điều tương tự, Hãy thử điều này,

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

trong range này trong trường hợp của bạn. Nếu bạn muốn tháng sau đó là 12, trong trường hợp của tuần 7, vv

trong interval bạn vượt qua 1.

trong slot bạn phải vượt qua, xác định dữ liệu của bạn như tháng, năm, ngày, tôi có sử dụng enum cho việc này.

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

Xem: http://prntscr.com/dbn62x

+0

Vui lòng sửa tôi nếu tôi sai, nhưng điều này không chỉ thay đổi giá trị hiển thị và không thay đổi vị trí thực tế của nhãn. Nó cho thấy các giá trị chính xác, nhưng ở (hơi) các vị trí không chính xác. – Marcel50506

+0

@ Marcel50506 bạn có thể cho tôi biết nếu câu trả lời này có hiệu quả với bạn không? – MeknessiHamida

+0

@MeknessiHamida: Không, nó không giải quyết được vấn đề của tôi. Như đã nói trong bình luận trước của tôi, nó không đặt đúng vị trí của các nhãn. – Marcel50506

0

Tôi đã có một vấn đề tương tự với các ngày trong tuần ...

Dấu thời gian của tôi có định dạng giống như của bạn, nhưng khi chúng được chuyển đổi thành nổi cho các mục nhập, chúng sẽ mất quá nhiều độ chính xác và cho tôi khoảng thời gian không đều.

tôi chuyển đổi timestamps của tôi trong millis để timestamps trong vài phút, và bây giờ nó hoạt động hoàn hảo

kiểm tra rằng việc chuyển đổi float không rối tung với độ chính xác của bạn, và từ đó bạn có thể thiết lập các phần còn lại của params rằng sẽ hãy thực hiện các khoảng thời gian của bạn thường xuyên

Các vấn đề liên quan