2012-05-16 10 views

Trả lời

2

GraphView là một thư viện tuyệt vời để sử dụng, tôi cũng thấy nó dễ nhất. Bước đầu tiên trong việc thực hiện điều này là thêm một biến String vào lớp GraphViewData trong GraphView.java. Giống như vậy:

static public class GraphViewData { 
    public final double valueX; 
    public final double valueY; 
    public final String valueDate; 

    public GraphViewData(double valueX, double valueY,String valueDate) { 
     super(); 
     this.valueX = valueX; 
     this.valueY = valueY; 
     this.valueDate = valueDate; 
    } 
} 

Khi bạn tạo đối tượng GraphViewData khi tạo GraphView Graph, bạn sẽ cần thêm dữ liệu ngày ở dạng chuỗi (cùng với X và Y).

Giả sử bạn có 80 điểm dữ liệu trong biểu đồ (chỉ số 0 - 79). Có một phương thức trong GraphView chịu trách nhiệm tạo và trả về các nhãn nằm ngang, tôi tin rằng nó được gọi là generateHorLabels. Thay vì chỉ trả về giá trị X (0-79), hãy sử dụng giá trị X để lấy String từ đối tượng GraphData.

Trong đoạn mã bạn có bây giờ, nó cần phải có sau đây trong một cho loop

labels[i] = formatLabel(min + ((max-min)*i/numLabels), true); 

thay vì ở trên, bạn có thể làm một cái gì đó như thế này.

Double temp = Double.valueOf(formatLabel(min + ((max-min)*i/numLabels), true)); 
int rounded =(int)Math.round(temp); 
labels[i] = values[rounded].valueDate; 

Hy vọng điều này sẽ hữu ích!

+0

Thnx cho câu trả lời của bạn .. Tôi sẽ thử điều này ngày hôm nay, và xem tôi có thể hoàn thành nó ngay hôm nay không. Tôi có thể sẽ chấp nhận câu trả lời khi tôi thực hiện xong – Luciano

+0

, không có vấn đề gì, hy vọng bạn có được nó hoạt động. – wdziemia

+0

Ye đã làm việc với rất nhiều công cụ tùy chỉnh, như cửa sổ bật lên khi nhấp vào một điểm và giao diện :) – Luciano

12

Đây là cách chính xác để làm điều này

Bạn chỉ cần sử dụng dấu thời gian unix (giây từ 1970/01/01) là giá trị x.

Sau đó, bạn có thể thiết lập một định dạng nhãn tùy chỉnh và chuyển đổi các dấu thời gian unix vào một String:

final java.text.DateFormat dateTimeFormatter = DateFormat.getTimeFormat(mActivity); 

LineGraphView graphView = new LineGraphView(mActivity, entry.getValue()) { 
    @Override 
    protected String formatLabel(double value, boolean isValueX) { 
     if (isValueX) { 
      // transform number to time 
      return dateTimeFormatter.format(new Date((long) value*1000)); 
     } else { 
      return super.formatLabel(value, isValueX); 
     } 
    } 
}; 
+0

Hi @ jjoe64 thư viện của bạn là lam tôt lăm. Tôi đang cố gắng sử dụng nó với ngày như trục x như OP của câu hỏi này nhưng tôi có một vấn đề khác nhau. Nếu chuỗi các giá trị x không phải là tuyến tính, tôi lấy graphview đặt các giá trị giữa các ranh giới của chuỗi ở những vị trí sai. Điều này là, cho {1, 3, 4}, nó đặt đúng 1 và 4, nhưng không phải 3. Tôi nghĩ rằng tôi phải điền vào tất cả các giá trị bị thiếu (hoặc cung cấp cho những người làm cho chuỗi tuyến tính) nhưng dường như tôi như một chút xấu xí dung dịch. Có cách nào khác để làm điều này với thư viện của bạn mà tôi không biết? Cảm ơn! –

+0

hi. graphview không quan tâm đến chuỗi dữ liệu của bạn. nó chỉ tạo nhãn ở vị trí cho nhãn đó. không có cách nào để tác động đến vị trí của nhãn. bạn có thể thực hiện giải pháp cho trường hợp đặc biệt của bạn, hãy xem nhãn tĩnh hoặc GraphViewStyle # setNumHorizontalLabels – appsthatmatter

+1

@ jjoe64 Tôi mới sử dụng Android, vì vậy tôi đã nhầm lẫn một chút, tôi đang cố gắng sử dụng phần được cung cấp của bạn mã, nhưng tôi không hiểu, 'entry.getValue()' là gì? https://dl.dropboxusercontent.com/u/6151466/graphview.jpg đây là tình huống của tôi. Bạn có thể giúp tôi với điều này ? cảm ơn –

1

Dưới đây là câu trả lời được cập nhật từ jjoe64, với x-giá trị thu được từ ngày # getTime()

final DateFormat dateTimeFormatter = DateFormat.getDateTimeInstance();   
    graphView = new LineGraphView(context, "Chart"); 
    graphView.setCustomLabelFormatter(new CustomLabelFormatter() 
    { 
     @Override 
     public String formatLabel(double value, boolean isValueX) 
     { 
      if (isValueX) 
      { 
       return dateTimeFormatter.format(new Date((long) value)); 
      } 
      return null; // let graphview generate Y-axis label for us 
     } 
    }); 
0

tôi tạo ra các nhãn ngang cùng lúc tôi đã thiết lập các giá trị:

public void initializeLineGraphView() { 

    // Get last weeks entries from the DB 
    ArrayList<Entry> entries = DbManager.getInstance().getLastWeeksEntries(new Date()); 
    String[] hLabels = new String[entries.size()]; 
    GraphView.GraphViewData[] graphViewData = new GraphView.GraphViewData[entries.size()]; 

    for(int i = 0; i < entries.size(); i++) { 

     Entry entry = entries.get(i); 
     int pain = entry.getPain(); 
     graphViewData[i] = new GraphView.GraphViewData(i, pain); 

     // Generate the horizontal labels 
     SimpleDateFormat sdf = new SimpleDateFormat("EEE"); 
     String dayOfWeek = sdf.format(entry.getDate()); 
     hLabels[i] = dayOfWeek; 

    } 

    mSeries = new GraphViewSeries("", null, graphViewData); 
    GraphView graphView = new LineGraphView(getActivity(), ""); 
    graphView.addSeries(mSeries); 
    graphView.setHorizontalLabels(hLabels); 
    graphView.setVerticalLabels(new String[] {"10", "5", "0"}); 
    mLineGraphView = graphView; 

}