Android App - Objekt bewegt sich nach Handyneigung

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);
}

};
}

}
 
Hallo zu deinem Code.
Ich kann leider nichts in deinen Code finden was du bewegst, schon gar nicht einen Kreis.

Du zeigt die werte ja nur an mehr nicht . Auch dein Anfängliches verschieben der Textview macht für mich keinen sinn.
Bist du dir sicher uns den richtigen Code gegeben zu haben?
 
Hallo und danke erstmal für deine schnelle Antwort!
Du hast natürlich vollkommen Recht ->ich muss mich entschuldigen. Montag kann ich den richtigen Code reinstellen,
sowas passiert wenn man zu viele Programme aufhaut:1f611:.
 
Hier der Code...

public class MainActivity extends Activity implements View.OnClickListener{

private ImageView greenPoint;
private Button btKalibrierung;
private Button btStart;
public float xWert;
public float yWert;


public SensorData test = new SensorData(this);

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
greenPoint = findViewById(R.id.GreenPoint);
btKalibrierung = findViewById(R.id.bt_kalibrierung);
btKalibrierung.setOnClickListener(this); // calling onClick() method
btStart = findViewById(R.id.bt_start);
btStart.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!)


//Werte zur besseren darstellung mit 100 multipliziert
float sensorData0 = Math.round(sensorData[0] * 100 * 20);
float sensorData1 = Math.round(sensorData[1] * 100 * 20);
//float sensorData2 = Math.round(sensorData[2] * 100); //Z-Achse


//Rechts- und Linksneigung
if ((sensorData0 > 0) && (sensorData0 <= 500)) {
;
greenPoint.setTranslationY(sensorData0);
//params.setMargins(0,240-sensorData0 ,0 ,0);
} else if ((sensorData0 > 500)) {
greenPoint.setTranslationY(500);
} else if ((sensorData0 < 0) && (sensorData0 >= -500)) {
greenPoint.setTranslationY(sensorData0);
} else if ((sensorData0 < -500)) {
greenPoint.setTranslationY(-500);
}

//hoch und runter
if ((sensorData1 > 0) && (sensorData1 <= 500)) {
greenPoint.setTranslationX(sensorData1);
} else if ((sensorData1 > 500)) {
greenPoint.setTranslationX(500);
} else if ((sensorData1 < 0) && (sensorData1 >= -500)) {
greenPoint.setTranslationX(sensorData1);
} else if ((sensorData1 < -100)) {
greenPoint.setTranslationX(-500);
}

}
};

//init & start the Sensor
test.startSensor();


}
 
Hallo ich glaube du hast da zwischen X u. Y einen Dreher drin.
sensorData0 ist "X" und du macht da setTranslationY also verschieben nach "Y"
 
Lade dir mal Cpu-Z gehe dort auf Sensors. Da kannst du recht gut beobachten welche Axse bei welcher bewegung des Handys anspricht.
 
  • Danke
Reaktionen: philippsw

Ähnliche Themen

D
Antworten
23
Aufrufe
2.558
Data2006
D
5
Antworten
0
Aufrufe
1.152
586920
5
SaniMatthias
Antworten
19
Aufrufe
962
swa00
swa00
Zurück
Oben Unten