martedì 30 ottobre 2012

Disegnare grafici in Android con GrahView

Un'altra libreria (oltre alla gia' citata AndroidPlot) per disegnare grafici su Android e' GraphView

Rispetto alla precedente e' meno commentata ed di utilizzo un po' piu' difficile ma permette di mostrare dati in realtime ed ha lo zoom ed il pan dinamico mediante gesture

Un po' di indicazioni: il tutorial sul sito dello sviluppatore funziona solo con la versione 2.0 (al momento della scrittura di questo post la versione piu' recente e' la 3.0); per questo motivo anche io ho usato la versione 2

Inoltre di default i colori delle label sugli assi delle ascisse e delle ordinate ed il titolo sono bianchi per cui iniziando un progetto da zero con il nuovo SDK si deve cambiare il colore di background della activity (che gia' di suo e' bianco) altrimenti scompare tutto

-------------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     android:background="#000000" >

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/graph1" />
       
</RelativeLayout>

-------------------------------------------
Usando il codice sotto riportato (un misto tra il codice di esempio ed alcune righe che ho inserito io)  si ha come risultato questa immagine




-------------------------------------------
package com.test.graph;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.widget.LinearLayout;

import com.jjoe64.graphview.GraphView.GraphViewData;
import com.jjoe64.graphview.GraphView.GraphViewSeries;
import com.jjoe64.graphview.GraphView.LegendAlign;
import com.jjoe64.graphview.LineGraphView;

public class MainActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        int num = 150; 
        GraphViewData[] data = new GraphViewData[num]; 
        double v=0; 
        for (int i=0; i<num; i++) { 
           v += 0.2; 
           data[i] = new GraphViewData(i, Math.sin(v)); 
        } 
        GraphViewSeries seriesSin = new GraphViewSeries("Seno", Color.rgb(200, 50, 00), data); 
       
        //attenzione l'array dei dati deve essere completo
        //se si omette per esempio di dichiarare dati[4] il programma genera una eccezione
        GraphViewData[] dati = new GraphViewData[5];
        dati[0] = new GraphViewData(0,0);
        dati[1] = new GraphViewData(10,0.5);
        dati[2] = new GraphViewData(15,1.5);
        dati[3] = new GraphViewData(17,0.7);
        dati[4] = new GraphViewData(22,0.7);

       
        GraphViewSeries seriedati = new GraphViewSeries("Misure", Color.rgb(0, 250, 00), dati);
       
        LineGraphView graphView = new LineGraphView( 
              this 
              , "Titolo Grafico" 
        );
       
        // aggiungi la serie dati
        graphView.addSeries(seriesSin);
        graphView.addSeries(seriedati); 
     
        // finestra di visualizzazione del grafico 
        graphView.setViewPort(0, 20); 
        graphView.setScrollable(true); 
        graphView.setScalable(true); 
       
        // Legenda 
        graphView.setShowLegend(true); 
        graphView.setLegendAlign(LegendAlign.BOTTOM); 
        graphView.setLegendWidth(70);
         
        LinearLayout layout = (LinearLayout) findViewById(R.id.graph1); 
        layout.addView(graphView); 
    }