Aller au contenu

[Résolu] Aide developpement avec accelerometre


Recommended Posts

Bonjour,

je débute dans le développement d'application sous Android.

J'ai lu quelques sujets et fait quelques tutos, mais je crois que bien que google soit présent un petit coup de main personnalisé m'aiderait bien plus pour avancer !!!

Voilà mon problème, j'aimerais que selon l'inclinaison du téléphone un texte (contenant les valeurs de l'accéléromètre) soit déplacé jusqu'au bord de l'écran. (Un peu comme une boule dans un plateau).

Je pensais avoir toutes les clés en main, mais je me confronte au problème de rafraichissement du texte. Je vous donne mon code source :


import android.app.Activity;
import android.os.Bundle;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
import android.view.View;
import android.widget.TextView;


public class TestAccel extends Activity {
private SensorManager sensorManager;
private Sensor sensor;
private float x, y, z;
private SimulationView sm;
String st = new String("Coucou !");
private static final String TAG = "TestAccel";

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
	sensor = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);

	new TextView(this);
	sm = new SimulationView(this);
	setContentView(sm);
}

@Override
protected void onResume() {
	super.onResume();
}

@Override
protected void onStop() {
	super.onStop();
}

class SimulationView extends View{

   	Paint pt = new Paint();

   	public SimulationView(Context context) {
	super(context);
}

       @Override
       protected void onDraw(Canvas canvas) {
       	pt.setColor(Color.BLUE);
       	pt.setTextSize(12);
       	canvas.drawText(st, 0, st.length(), 10, 10, pt);
       	Log.v(TAG,"draw");
       }

       protected void onResume() {
	sensorManager.registerListener(accelerationListener, sensor,
				SensorManager.SENSOR_DELAY_GAME);
       	Log.v(TAG,"resume");
}

protected void onStop() {
	sensorManager.unregisterListener(accelerationListener);
       	Log.v(TAG,"stop");
}	

private SensorEventListener accelerationListener = new SensorEventListener() {
		@Override
		public void onAccuracyChanged(Sensor sensor, int acc) {
		}

		@Override
		public void onSensorChanged(SensorEvent event) {
			x = event.values[0];
			y = event.values[1];
			z = event.values[2];
			refreshDisplay();
			sm.requestLayout();
        	Log.v(TAG,"onsensorchanged");
		}

		private void refreshDisplay() {
			st = String.format("x is: %f / y is: %f / z is: %f", x, y, z); // Les coordonnées sont bien dans la chaine de caractères.
			//result.setText(output);
		}
};
}

Dans un premier temps, sans déplacer le texte, il faudrait que je puisse y afficher les coordonnées. J'ajoute que si je ne crée par de classe SimulationView et que j'ajoute simplement un TextView dans la méthode onCreate avec le setContentView(Textview), les valeurs du capteurs s'affichent bien en temps réel.

Ensuite, sur l'événement onSensorChanged il faudrait déplacer ce texte...

Pour info, je début aussi un peu en java, si j'ai fait des erreurs ou si je n'ai pas suivi la méthode de développement java, veuillez m'excuser XD

Je vous remercie de m'indiquer les voies à suivre pour arriver à mes fins !!

Nckb

Lien vers le commentaire
Partager sur d’autres sites

Bon en relisant le code par rapport à celui qui fonctionne mais qui n'utilise pas la classe SimulationView, je me suis aperçu que j'avais oublié d'appeler les méthodes suivantes :

@Override

protected void onResume() {

super.onResume();

sm.onResume();

}

@Override

protected void onStop() {

sm.onStop();

super.onStop();

}

Ce n'est pas fluide du tout, mais au moins j'ai récupéré les coordonnées du capteur =)

Et pourtant je l'avais relu plusieurs fois ce code... alala

Merci en tout cas !

Lien vers le commentaire
Partager sur d’autres sites

et juste pour rendre l'affichage des coordonnées fluides et non pas uniquement sur changement de view (par rotation), il suffit d'appeler la méthode sm.invalidate(); dans la méthode public void onSensorChanged(SensorEvent event) {

Voilà,

bonne continuation à tous, et peut etre a bientot ^^

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...