Skip to content

Grafici con AndroidPlot

AndroidPlot è una libreria java per Android che consente la creazione di grafici statici e dinamici in modo semplice ed efficace. Dispone anche di un piccolo wiki con alcuni esempi pronti.

Grafico

Grafico

Vediamo un semplice programma che visualizza su un grafico a barre i valori letti dall’accelerometro.

MainActivity.java

package it.sarasini.android.graficoaccelerometri;
 
import it.sarasini.android.graficoaccelerometri.R;
import java.util.Arrays;
 
import com.androidplot.xy.BarFormatter;
import com.androidplot.xy.BarRenderer;
import com.androidplot.xy.BoundaryMode;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
 
import android.app.Activity;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
 
public class MainActivity extends Activity implements SensorEventListener {
 
	private SensorManager mSensorManager = null;
 
	private XYPlot grafico = null;
	private SimpleXYSeries serie = null;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
 
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        grafico = (XYPlot) findViewById(R.id.grafico);
        makeChart(grafico);
 
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    	mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
    }
 
    public void makeChart(XYPlot grafico) {
 
    	serie = new SimpleXYSeries("valori");
 
    	grafico.addSeries(serie, BarRenderer.class, new BarFormatter(Color.BLUE, Color.DKGRAY));
        grafico.setDomainStepValue(3);
        grafico.setTicksPerRangeLabel(3);
 
        grafico.setDomainValueFormat(new MyFormat());
 
        grafico.setRangeBoundaries(-11, 11, BoundaryMode.FIXED);
 
        // update our domain and range axis labels:
        grafico.setDomainLabel("Axis");
        grafico.getDomainLabelWidget().pack();
        grafico.setRangeLabel("Angle (Degs)");
        grafico.getRangeLabelWidget().pack();
 
        BarRenderer barRenderer = (BarRenderer) grafico.getRenderer(BarRenderer.class);
        if(barRenderer != null)
            barRenderer.setBarWidth(30, BarRenderer.BarWidthStyle.FIXED_WIDTH);
 
        grafico.setGridPadding(30, 0, 30, 0);
        grafico.disableAllMarkup();
 
    }
 
    @Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
		// TODO Auto-generated method stub
	}
 
	@Override
	public void onSensorChanged(SensorEvent event) {
 
		if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
 
			// Dalla documentazione:
			// All values are in SI units (m/s^2) and  measure the
			// acceleration applied to the phone minus the force of gravity. 
 
			Number[] series1Numbers = {event.values[0], event.values[1], event.values[2]};
	        serie.setModel(Arrays.asList(series1Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY);
 
			grafico.redraw();
 
		}
	}
}

MyFormat.java

package it.sarasini.android.graficoaccelerometri;
 
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
 
@SuppressWarnings("serial")
public class MyFormat extends Format {
 
        @Override
        public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
 
        	Number num = (Number) obj;
            // using num.intValue() will floor the value, so we add 0.5 to round instead:
            int roundNum = (int) (num.floatValue() + 0.5f);
            switch(roundNum) {
                case 0:
                    toAppendTo.append("X");
                    break;
                case 1:
                    toAppendTo.append("Y");
                    break;
                case 2:
                    toAppendTo.append("Z");
                    break;
                default:
                    toAppendTo.append("Unknown");
            }
            return toAppendTo;
        }
 
        @Override
        public Object parseObject(String source, ParsePosition pos) {
            return null;  // We don't use this so just return null for now.
        }
}

Grafici accelerometro

Categories: Android.

Tags: , ,

Comment Feed

3 Responses

  1. main.xml please…
    or send me the .zip project
    Mine don’t work
    Thank you

    MarcoMay 26, 2012 @ 02:43



Some HTML is OK

or, reply to this post via trackback.

*

Continuing the Discussion

  1. [...] piace la tua idea. Hai qualcosa da consigliare? Girando ho trovato questa libreria java –> Grafici con AndroidPlot | DevSide come ti sembra? Rispondi [...]

  2. [...] Re: Librerie per generare grafici in Android dani hai dato uno sguardo qui Grafici con AndroidPlot | DevSide [...]

Tutto il materiale di questo blog è rilasciato sotto licenza GNU FDL