2012-05-16 13 views

risposta

2

GraphView è una grande libreria da utilizzare, la trovo anche la più semplice. Il primo passo per farlo sarebbe quello di aggiungere una variabile stringa nella classe GraphViewData in GraphView.java. In questo modo:

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

Quando si crea l'oggetto GraphViewData quando si crea un GraphView grafico, è necessario aggiungere i dati di data in forma di stringa (insieme con la X e Y).

Diciamo che nel grafico sono presenti 80 punti dati (indice 0 - 79). C'è un metodo all'interno di GraphView che è responsabile della generazione e della restituzione delle etichette orizzontali, credo che sia chiamato generateHorLabels. Invece di restituire il valore X (0-79), utilizzare il valore X per ottenere la stringa dall'oggetto GraphData.

Nel codice che hai ora, dovrebbe avere la seguente in un per ciclo

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

invece di quanto sopra, si potrebbe fare qualcosa di simile.

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

Spero che questo ha aiutato!

+0

Thnx per la risposta .. Ci proverò oggi e vedrò se riesco a farcela oggi. Probabilmente accetterò la risposta quando avrò finito lo – Luciano

+0

senza problemi, spero che tu abbia funzionato. – wdziemia

+0

Hai funzionato con un sacco di materiale personalizzato, come i popup quando fai clic su un punto e un'interfaccia :) – Luciano

12

questo è il modo corretto per farlo

Devi solo usare il timestamp Unix (secondi dal 1970/01/01) come valore di x.

quindi è possibile impostare un formattatore un'etichetta personalizzata e convertire il timestamp Unix in una stringa:

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

Ciao @ jjoe64 la tua libreria è un ottimo lavoro. Sto cercando di usarlo con le date come asse x come l'OP di questa domanda, ma ho un problema diverso. Se la sequenza di valori x non è lineare, ottengo la graphview mettendo i valori tra i limiti della sequenza in posti sbagliati. Questo è, per {1, 3, 4}, mette a destra 1 e 4, ma non 3. Penso di dover riempire tutti i valori mancanti (o dare quelli che rendono la sequenza lineare) ma mi sembra un po 'brutto soluzione. C'è un altro modo per farlo con la tua libreria di cui non sono a conoscenza? Grazie! –

+0

ciao. graphView non si preoccupa della tua sequenza di dati. genera solo le etichette nella posizione per tale etichetta. non c'è modo di influire sulle posizioni delle etichette. potresti forse fare una soluzione alternativa per il tuo caso speciale, dare un'occhiata alle etichette statiche, o GraphViewStyle # setNumHorizontalLabels – appsthatmatter

+1

@ jjoe64 Sono nuovo su Android, quindi ora sono un po 'confuso, sto cercando di usare il tuo pezzo offerto codice, ma non capisco, cosa è 'entry.getValue()'? https://dl.dropboxusercontent.com/u/6151466/graphview.jpg questa è la mia situazione. Puoi aiutarmi con questo ? grazie –

1

Ecco la risposta aggiornato dal jjoe64, con i valori x ottenuti da Data # 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

ho creato le etichette orizzontali, allo stesso tempo mi è stato l'impostazione dei valori:

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; 

} 
Problemi correlati