P
philippsw
Neues Mitglied
- 0
Hallo Leute!
Ich versuche zurzeit eine App zu programmieren in der sich ein Objekt (bei mir einfach ein Kreis) in die Richtung bewegt, in die das Handy geneigt wird. Dazu habe ich die Werte des Sensors "Game Rotatian Vektor" einlesen lassen. Das Programm dazu läuft ohne Probleme, der Kreis bewegt sich in die Richtige Richtung..leider nur solange das Handy nicht in der Z-Achse bewegt wird (Achse, die aus dem Bildschirm kommt). Dann passen die Werte des Sensors nicht mehr. Hat jemand eine Idee wie man das Problem beheben bzw. ausgleichen kann?
package com.example.phsch019.beschleunigungssensor;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.ActionMode;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements View.OnClickListener{
float merker_x;
float merker_y;
float merker_z;
TextView tv_xAchseMax;
TextView tv_yAchseMax;
TextView tv_zAchseMax;
TextView tv_xAchse;
TextView tv_yAchse;
TextView tv_zAchse;
Button bt_clear;
public SensorData test = new SensorData(this);
@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_xAchseMax = findViewById(R.id.x_achse_max);
tv_yAchseMax = findViewById(R.id.y_achse_max);
tv_zAchseMax = findViewById(R.id.z_achse_max);
tv_xAchse = findViewById(R.id.x_achse);
tv_xAchse.setMovementMethod(new ScrollingMovementMethod());
tv_yAchse = findViewById(R.id.y_achse);
tv_yAchse.setMovementMethod(new ScrollingMovementMethod());
tv_zAchse = findViewById(R.id.z_achse);
tv_zAchse.setMovementMethod(new ScrollingMovementMethod());
bt_clear = findViewById(R.id.bt_clear);
bt_clear.setOnClickListener(this);
//_callback hier =! null und wird so in SensorData aufgerufen
test._callback = new SensorData.ISensorCallback() {
@override
public void onSensorArrived(float[] sensorData,float[] max_sensorData) {
// Synchronisierung Hintergrundprozess (Sensor) und UI-Prozess
// UI Thread muss kurz unterbrochen werden, um Label zu setzen
/*runOnUiThread(new Runnable() {
@override
public void run() {
tv_xAchse.setText(Float.toString(sensorData[0]));
}
});*///(nicht notwendig, Android Studio macht das intern selber!)
//max. Werte in der Activity ausgeben
tv_xAchseMax.setText(" max. Beschleunigung der X-Achse: "+ max_sensorData[0]*100);
tv_yAchseMax.setText(" max. Beschleunigung der Y-Achse: "+ max_sensorData[1]*100);
tv_zAchseMax.setText(" max. Beschleunigung der Z-Achse: "+ max_sensorData[2]*100);
//zur besseren darstellung mit 100 multipliziert (nur bei Game Rotation Sensor!!!)
sensorData[0]=sensorData[0]*100;
sensorData[1]=sensorData[1]*100;
sensorData[2]=sensorData[2]*100;
//es werden nur Werte ausgegeben die um -+0,5 größer sind!
if ((sensorData[0] >= (merker_x+0.005))||(sensorData[0] <= (merker_x-0.005))) {
tv_xAchse.setText(Float.toString(sensorData[0]) + "\n");
}
if ((sensorData[1] >= (merker_y+0.005))||(sensorData[1] <= (merker_y-0.005))) {
tv_yAchse.setText(Float.toString(sensorData[1]) + "\n");
}
if ((sensorData[2] >= (merker_z+0.005))||(sensorData[2] <= (merker_z-0.005))) {
tv_zAchse.setText(Float.toString(sensorData[2]) + "\n");
}
//Merker für den Vergleich der Differenz
merker_x = sensorData[0];
merker_y = sensorData[1];
merker_z = sensorData[2];
}
};
//init & start the Sensor
test.startSensor();
}
@override
protected void onResume() {
super.onResume();
tv_xAchse.setText("X-Achse:\n");
tv_yAchse.setText("Y-Achse:\n");
tv_zAchse.setText("Z-Achse:\n");
}
@override
public void onClick(View view){
//Sensorwerte werden gelöscht beim betätigen von Clear all
//ACHTUNG: bei mehreren Button Abfrage mit switch case erforderlich!
tv_xAchse.setText("X-Achse:\n");
tv_yAchse.setText("Y-Achse:\n");
tv_zAchse.setText("Z-Achse:\n");
}
@override
public void onPause() {
super.onPause();
//test: Objekt von Sensordata -> _unregister: Objekt der Unterklasse(interface) IUnregisterCallback
test._unregister = new SensorData.IUnregisterCallback() {
@override
public void unregisterSensor(SensorManager listener, Sensor accelerometer) {
//Sensor wird abgemeldet
test._unregister.unregisterSensor(listener,accelerometer);
}
};
}
}
Ich versuche zurzeit eine App zu programmieren in der sich ein Objekt (bei mir einfach ein Kreis) in die Richtung bewegt, in die das Handy geneigt wird. Dazu habe ich die Werte des Sensors "Game Rotatian Vektor" einlesen lassen. Das Programm dazu läuft ohne Probleme, der Kreis bewegt sich in die Richtige Richtung..leider nur solange das Handy nicht in der Z-Achse bewegt wird (Achse, die aus dem Bildschirm kommt). Dann passen die Werte des Sensors nicht mehr. Hat jemand eine Idee wie man das Problem beheben bzw. ausgleichen kann?
package com.example.phsch019.beschleunigungssensor;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.ActionMode;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements View.OnClickListener{
float merker_x;
float merker_y;
float merker_z;
TextView tv_xAchseMax;
TextView tv_yAchseMax;
TextView tv_zAchseMax;
TextView tv_xAchse;
TextView tv_yAchse;
TextView tv_zAchse;
Button bt_clear;
public SensorData test = new SensorData(this);
@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_xAchseMax = findViewById(R.id.x_achse_max);
tv_yAchseMax = findViewById(R.id.y_achse_max);
tv_zAchseMax = findViewById(R.id.z_achse_max);
tv_xAchse = findViewById(R.id.x_achse);
tv_xAchse.setMovementMethod(new ScrollingMovementMethod());
tv_yAchse = findViewById(R.id.y_achse);
tv_yAchse.setMovementMethod(new ScrollingMovementMethod());
tv_zAchse = findViewById(R.id.z_achse);
tv_zAchse.setMovementMethod(new ScrollingMovementMethod());
bt_clear = findViewById(R.id.bt_clear);
bt_clear.setOnClickListener(this);
//_callback hier =! null und wird so in SensorData aufgerufen
test._callback = new SensorData.ISensorCallback() {
@override
public void onSensorArrived(float[] sensorData,float[] max_sensorData) {
// Synchronisierung Hintergrundprozess (Sensor) und UI-Prozess
// UI Thread muss kurz unterbrochen werden, um Label zu setzen
/*runOnUiThread(new Runnable() {
@override
public void run() {
tv_xAchse.setText(Float.toString(sensorData[0]));
}
});*///(nicht notwendig, Android Studio macht das intern selber!)
//max. Werte in der Activity ausgeben
tv_xAchseMax.setText(" max. Beschleunigung der X-Achse: "+ max_sensorData[0]*100);
tv_yAchseMax.setText(" max. Beschleunigung der Y-Achse: "+ max_sensorData[1]*100);
tv_zAchseMax.setText(" max. Beschleunigung der Z-Achse: "+ max_sensorData[2]*100);
//zur besseren darstellung mit 100 multipliziert (nur bei Game Rotation Sensor!!!)
sensorData[0]=sensorData[0]*100;
sensorData[1]=sensorData[1]*100;
sensorData[2]=sensorData[2]*100;
//es werden nur Werte ausgegeben die um -+0,5 größer sind!
if ((sensorData[0] >= (merker_x+0.005))||(sensorData[0] <= (merker_x-0.005))) {
tv_xAchse.setText(Float.toString(sensorData[0]) + "\n");
}
if ((sensorData[1] >= (merker_y+0.005))||(sensorData[1] <= (merker_y-0.005))) {
tv_yAchse.setText(Float.toString(sensorData[1]) + "\n");
}
if ((sensorData[2] >= (merker_z+0.005))||(sensorData[2] <= (merker_z-0.005))) {
tv_zAchse.setText(Float.toString(sensorData[2]) + "\n");
}
//Merker für den Vergleich der Differenz
merker_x = sensorData[0];
merker_y = sensorData[1];
merker_z = sensorData[2];
}
};
//init & start the Sensor
test.startSensor();
}
@override
protected void onResume() {
super.onResume();
tv_xAchse.setText("X-Achse:\n");
tv_yAchse.setText("Y-Achse:\n");
tv_zAchse.setText("Z-Achse:\n");
}
@override
public void onClick(View view){
//Sensorwerte werden gelöscht beim betätigen von Clear all
//ACHTUNG: bei mehreren Button Abfrage mit switch case erforderlich!
tv_xAchse.setText("X-Achse:\n");
tv_yAchse.setText("Y-Achse:\n");
tv_zAchse.setText("Z-Achse:\n");
}
@override
public void onPause() {
super.onPause();
//test: Objekt von Sensordata -> _unregister: Objekt der Unterklasse(interface) IUnregisterCallback
test._unregister = new SensorData.IUnregisterCallback() {
@override
public void unregisterSensor(SensorManager listener, Sensor accelerometer) {
//Sensor wird abgemeldet
test._unregister.unregisterSensor(listener,accelerometer);
}
};
}
}