Déplacement d'une image à l'aide de l'Accéléromètre de android
J'ai lu des articles/didacticiel sur l'accès à l'accéléromètre du téléphone (accélération et de l'orientation) des valeurs. Je suis en train de construire une application simple où je peux déplacer une balle de l'image à l'aide de ces valeurs. Voici mon code:
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class Accelerometer extends Activity implements SensorEventListener {
/** Called when the activity is first created. */
CustomDrawableView mCustomDrawableView = null;
ShapeDrawable mDrawable = new ShapeDrawable();
int x ;
int y ;
private SensorManager sensorManager = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Get a reference to a SensorManager
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mCustomDrawableView = new CustomDrawableView(this);
setContentView(mCustomDrawableView);
// setContentView(R.layout.main);
}
//This method will update the UI on new sensor events
public void onSensorChanged(SensorEvent sensorEvent) {
{
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
int someNumber = 100;
float xChange = someNumber * sensorEvent.values[1];
//values[2] can be -90 to 90
float yChange = someNumber * 2 * sensorEvent.values[2];
x = x + (int)xChange;
y = y + (int)yChange;
}
if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
}
}
}
//I've chosen to not implement this method
public void onAccuracyChanged(Sensor arg0, int arg1) {
//TODO Auto-generated method stub
}
@Override
protected void onResume() {
super.onResume();
//Register this class as a listener for the accelerometer sensor
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
//...and the orientation sensor
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onStop() {
//Unregister the listener
sensorManager.unregisterListener(this);
super.onStop();
}
public class CustomDrawableView extends View {
public CustomDrawableView(Context context) {
super(context);
int width = 50;
int height = 50;
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xff74AC23);
mDrawable.setBounds(x, y, x + width, y + height);
}
protected void onDraw(Canvas canvas) {
mDrawable.draw(canvas);
invalidate();
}
}
}
Je reçois une forme ovale affiché sur l'écran mais rien ne se passe après.
grâce
- Dans votre onDraw vous ne faites rien pour déplacer votre forme. Vous devez ajouter le code qui définit l'emplacement de votre drawable (à partir des valeurs X,Y, vous êtes le stockage)
- comment puis-je le faire.. pouvez-vous me donner un exemple de code
- Essayer de mettre cela dans votre méthode onDraw "RectF ovale = new RectF(Accéléromètre.x, Accéléromètre.y, Accéléromètre.x + largeur, l'Accéléromètre.y + hauteur); //définir les limites du rectangle de Peinture p = new Paint(); //définir certaines options de peinture de la toile.drawOval(ovale, p);" Vous aurez besoin pour rendre votre X et Y des variables des membres du public et votre largeur / hauteur doivent être des valeurs statiques dans votre CustomDrawableView classe.
Vous devez vous connecter pour publier un commentaire.
Utiliser ce code. Vous n'avez jamais été la définition de l'emplacement de la drawable après avoir initialisée cette classe. Vous aurez à faire quelques calculs pour définir les boules emplacement correctement. La façon dont vous le faisiez était d'obtenir des valeurs de plus de 10000 qui est le dessin de l'ovale hors de l'écran.
Voici ma mise en œuvre de ce problème. Dymmeh la solution jeter des problèmes à moi, j'ai donc refait jusqu'à ce que j'ai eu de travail.
J'ai fait quelques modifications dans onSensorChange code pour déplacer la balle dans l'écran. Avec l'exemple dans mon cas, la balle ne pas se déplacer correctement et pour qui j'ai fait les modifications. Cet exemple Fonctionne très bien pour moi.
La classe de la vue où je tire la balle
}
C'est tout, j'espère que nous aider.
Essayez d'utiliser
sensorEvent.values[0]
pour votrexChange
etsensorEvents.values[1]
pour votreyChange
si vous souhaitez utiliser le capteur d'accélération, si pas utiliser les mêmes valeurs et le déplacer dans le (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION
) si la déclaration, cela vous donnera de l'inclinaison de l'appareil, plutôt que la façon dont rapidement son déplacement le long d'un axe.Vous devez également appeler
invalidate();
sur la Vue lorsque vous définissez ou modifiez un capteur.La
Sensor.TYPE_ACCELEROMETER
retourne:La
Sensor.TYPE_ORIENTATION
retourne:values[0]
: Azimut, angle entre le nord magnétique de direction et l'axe des y, autour de l'axe z (0 à 359). 0=Nord, 90=Est, 180=Sud, 270=Ouestvalues[1]
: La hauteur, la rotation autour de l'axe x (-180 à 180), avec des valeurs positives lorsque l'axe z se déplace en direction de l'axe des y.values[2]
: Rouleau, en rotation autour de l'axe y (-90 à 90), avec des valeurs positives quand l'axe x se déplace en direction de l'axe des z.utiliser la bibliothèque suivante au lieu le défilement de mouvement
ajouter cette ligne en haut de la vue XML
pour la Mise en
de code dans votre onCreate() la méthode
dans votre onResume() la méthode
dans votre onDestroy() la méthode
Je pense que vous avez besoin d'invalider votre point de vue dans le onSensorChanged() la méthode ou à un fps taux que vous avez à mettre en œuvre.