2012-05-16 8 views

Respuesta

2

GraphView es una gran biblioteca para usar, también me resulta más fácil. El primer paso para hacer esto sería agregar una variable de cadena en la clase GraphViewData dentro de GraphView.java. Así como:

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

Cuando se crea el objeto GraphViewData al crear un gráfico GraphView, tendrá que añadir los datos de la fecha en forma de cadena (junto con el X e Y).

Digamos que tiene 80 puntos de datos en su gráfico (índice 0 - 79). Hay un método dentro de GraphView que es responsable de generar y devolver las etiquetas horizontales, creo que se llama generateHorLabels. En lugar de simplemente devolver el Valor X (0-79), use el valor X para obtener la Cadena del objeto GraphData.

En el código que tiene ahora, debe tener lo siguiente en un bucle para

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

en lugar de lo anterior, se podría hacer algo como esto.

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

Hope this help!

+0

Thnx por su respuesta .. Voy a probar esto hoy, y ver si puedo hacerlo hoy. Probablemente acepte la respuesta cuando haya terminado – Luciano

+0

no hay problema, espero que lo haya conseguido. – wdziemia

+0

Obtuviste trabajando con muchas cosas personalizadas, como ventanas emergentes al hacer clic en un punto e interfaz :) – Luciano

12

Esta es la forma correcta de hacer esto

Sólo tiene que utilizar la marca de tiempo Unix (segundos desde el 01.01.1970) como valor de x.

entonces se puede establecer un formateador etiqueta personalizada y convertir la marca de tiempo Unix en una cadena:

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 su biblioteca es una gran trabajo. Estoy tratando de usarlo con fechas como eje x como OP de esta pregunta, pero tengo un problema diferente. Si la secuencia de valores x no es lineal, obtengo el gráfico que coloca los valores entre los límites de la secuencia en lugares incorrectos. Esto es, para {1, 3, 4}, pone a la derecha 1 y 4, pero no 3. Creo que debo completar todos los valores faltantes (o dar los que hacen que la secuencia sea lineal) pero me parece un poco feo solución. ¿Hay alguna otra forma de hacer esto con su biblioteca que yo no sepa? ¡Gracias! –

+0

hola. graphview no se preocupa por su secuencia de datos. solo genera las etiquetas en la posición para esa etiqueta. no hay forma de impactar las posiciones de las etiquetas. tal vez podría hacer una solución para su caso especial, eche un vistazo a las etiquetas estáticas o GraphViewStyle # setNumHorizontalLabels – appsthatmatter

+1

@ jjoe64 soy nuevo en Android, así que estoy un poco confundido, estoy tratando de usar la pieza ofrecida código, pero no lo entiendo, ¿qué es 'entry.getValue()'? https://dl.dropboxusercontent.com/u/6151466/graphview.jpg esta es mi situación. Me puede ayudar con esto ? gracias –

1

Aquí está la respuesta actualizada de jjoe64, con los valores de x obtienen a partir de la fecha # 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

creé las etiquetas horizontales al mismo tiempo que estaba estableciendo los valores:

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; 

} 
Cuestiones relacionadas