Bild bewegen

  • Antworten:10
Daniel
  • Forum-Beiträge: 60

24.10.2011, 15:21:13 via Website

Hallo,

ich bin gerade dabei, ein kleines "Spiel" zu programmieren. Bisher wird nur der Lagesensor ausgelsen und angezeigt wie weit nach rechts oder links man das Handy kippt. Jetzt möchte ich aber noch eine kleine bilddatei aus den resourcen einfügen. Diese soll sich dann, je nachdem wie man das handy kippt nach links oder rechts bewegen. Ich hab schon gegooglet und einige beispiele dazu gefunden, allerdings habe ich es bisher nicht geschafft das in mein programm zu integrieren ohne dass es abstürzt. Könnte mir vllt jemand zeigen wie ich das mit dem bild in meinen programmcode einfügen kann?
Hier ist mein bisheriger code:

1public class activity extends Activity {
2 /** Called when the activity is first created. */
3 private static TextView textView1;
4 private String y;
5 private String wert1;
6 private float wert;
7 private SensorManager manager;
8 private SensorEventListener listener;
9 private Sensor sensor;
10
11 @Override
12
13 public void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.main);
16 textView1 = (TextView)findViewById(R.id.textView1);
17 manager = (SensorManager) getSystemService(SENSOR_SERVICE);
18
19
20 listener = new SensorEventListener() {
21 @Override
22 public void onAccuracyChanged(Sensor sensor, int accuracy) {
23 }
24
25 @Override
26 public void onSensorChanged(SensorEvent event) {
27 if(event.values.length > 0) {
28 float light = event.values[0];
29 wert = light;
30 y = Float.toString(light);
31 if (wert > 1)
32 {
33 if (wert >= 1 && wert <= 3)
34 {
35 textView1.setText("links1");
36 wert1 = "links1";
37 }
38 if (wert >= 3 && wert <= 6)
39 {
40 textView1.setText("links2");
41 wert1 = "links2";
42 }
43 if (wert > 6)
44 {
45 textView1.setText("links3");
46 wert1 = "links3";
47 }
48 }
49 if (wert < -1)
50 {
51 if (wert >= -3 && wert <= -1)
52 {
53 textView1.setText("rechts1");
54 wert1 = "rechts1";
55 }
56 if (wert >= -6 && wert <= -3)
57 {
58 textView1.setText("rechts2");
59 wert1 = "rechts2";
60 }
61 if (wert < -6)
62 {
63 textView1.setText("rechts3");
64 wert1 = "rechts3";
65 }
66 }
67 if (wert >= -1 && wert <= 1)
68 {
69 textView1.setText("mitte");
70 wert1 = "mitte";
71 }
72 }
73 }
74
75
76
77 };
78
79 sensor = manager.getDefaultSensor(Sensor.TYPE_GRAVITY);
80 if(sensor != null) {
81 manager.registerListener(listener, sensor, SensorManager.SENSOR_MAGNETIC_FIELD);
82 } else {
83 textView1.setText("Kein Sensor gefunden");
84 }
85 }
86
87
88
89 }

ich weiß, dass mein code vllt nicht sehr professionell ist, aber er funktioniert und ich verstehe was er tut.

Es wär nett wenn mir jemand helfen könnte :)

Antworten
Daniel
  • Forum-Beiträge: 60

25.10.2011, 17:02:04 via Website

danke für das gute tutorial, das hat mich schon einen schritt weitergebracht. mein bild wird jetzt angezeigt. allerdings weiß ich jetzt nicht wie ich es in Abhängigkeit von der lage des handys bewegen kann, da ich den wert des sensors in einer anderen klasse ermittle. außerdem sollte der wert des sensors regelmäßig aktualisiert werden.
ich würde jetzt gerne aus der klasse heraus, die den sensorwert ausliest, das bild anzeigen lassen. kann mir jemand erklären wie das geht?
mein code sieht jetzt so aus:
1public class activity extends Activity {
2 /** Called when the activity is first created. */
3 private static TextView textView1;
4 private String s;
5 private static String wert1;
6 private float wert;
7 private static int x = 138;
8 private static int y = 200;
9 private SensorManager manager;
10 private SensorEventListener listener;
11 private Sensor sensor;
12
13
14 @Override
15
16 public void onCreate(Bundle savedInstanceState) {
17 super.onCreate(savedInstanceState);
18 requestWindowFeature(Window.FEATURE_NO_TITLE);
19 setContentView(new Panel(this));
20
21 manager = (SensorManager) getSystemService(SENSOR_SERVICE);
22
23 listener = new SensorEventListener() {
24 @Override
25 public void onAccuracyChanged(Sensor sensor, int accuracy) {
26 }
27
28 @Override
29 public void onSensorChanged(SensorEvent event) {
30 if(event.values.length > 0) {
31 float light = event.values[0];
32 wert = light;
33 s = Float.toString(light);
34 if (wert > 1)
35 {
36
37 if (wert >= 1 && wert <= 3)
38 {
39
40 wert1 = "links1";
41 }
42 if (wert >= 3 && wert <= 6)
43 {
44
45 wert1 = "links2";
46 }
47 if (wert > 6)
48 {
49
50 wert1 = "links3";
51 }
52 }
53 if (wert < -1)
54 {
55 if (wert >= -3 && wert <= -1)
56 {
57
58 wert1 = "rechts1";
59 }
60 if (wert >= -6 && wert <= -3)
61 {
62
63 wert1 = "rechts2";
64 }
65 if (wert < -6)
66 {
67
68 wert1 = "rechts3";
69 }
70 }
71 if (wert >= -1 && wert <= 1)
72 {
73
74 wert1 = "mitte";
75 }
76 }
77 }
78
79
80
81 };
82
83 sensor = manager.getDefaultSensor(Sensor.TYPE_GRAVITY);
84 if(sensor != null) {
85 manager.registerListener(listener, sensor, SensorManager.SENSOR_MAGNETIC_FIELD);
86 } else {
87
88 }
89 }
90
91
92
93 public static int getx()
94 {
95 return x;
96 }
97 public static int gety()
98 {
99 return y;
100 }
101
102
103
104 }
105class Panel extends View {
106 Bitmap mBitmap;
107 public Panel(Context context) {
108 super(context);
109
110 mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.auto_oben1);
111
112 }
113
114 @Override
115 public void onDraw(Canvas canvas) {
116
117
118 canvas.drawColor(Color.BLACK);
119 int x = activity.getx();
120 int y = activity.gety();
121 canvas.drawBitmap(mBitmap, x, y, null);
122
123 }
124 }

— geändert am 25.10.2011, 17:24:29

Antworten
Maximilian O
  • Forum-Beiträge: 990

25.10.2011, 21:23:44 via App

Du weißt, das ganz rechts der lagesensor bei 70 ist (nur als Beispiel). so ermittelst du einfach die Entfernung mit klassischer prozentrechnung :)
MfG

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Daniel
  • Forum-Beiträge: 60

25.10.2011, 21:26:52 via Website

ok, danke für den tipp, allerdings bin ich noch garnicht so weit^^.
meine frage war wie ich das bild jetzt überhaupt bewegen kann. ich muss dazu ja den wert des lagesensors auslesen und dann den x oder y wert bei canvas ändern. da die 2 sachen aber in verschiedenen klassen sind, weiss ich nicht wie das geht.

Antworten
Maximilian O
  • Forum-Beiträge: 990

26.10.2011, 09:20:31 via App

Setze die Variablen deiner Klasse einfach auf public. Dann kannst du über das Objekt der Klasse drauf zugreifen.
MfG

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Daniel
  • Forum-Beiträge: 60

26.10.2011, 12:02:15 via Website

das mit den variablen geht jetzt einfacher, danke. :)
ich hab jetzt erstmal versucht das bild nach links zu bewegen, wenn man das handy etwas nach links kippt.
Dazu hab ich das einfach mal so eingebaut:
1public void onDraw(Canvas canvas) {
2 int x = activity.x;
3 int y = activity.y;
4 canvas.drawColor(Color.BLACK);
5 while (activity.wert1 == "links1")
6 {
7 x = x - 1;
8 }
9 canvas.drawBitmap(mBitmap, x, y, null);
10
11 }

das funktioniert leider nicht so gut. ich habe jetzt das problem, dass der lagesensor nur einmal beim starten des programms ausgelesen wird.
Halte ich das Handy jetzt beim Starten des Programms gerade wird das bild einfach in der mitte angezeigt. Halte ich es beim start etwas nach links wird das bild garnicht angezeigt, was warscheinlich daran liegt, dass der wert des lagesensors sich ja nicht ändert und es dann nicht aus der while schleife rauskommt.
wie bekomme ich das jetzt so hin, dass der wert des lagesensors ständig neu ausgelesen wird und nicht nur einmal am start?

Antworten
Maximilian O
  • Forum-Beiträge: 990

26.10.2011, 22:12:33 via App

Na du musst einfach in dem onAcc...Chance der Sensoren die Infrastruktur aufrufen. Somit wird es jedesmal aktualisiert.
MfG

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Daniel
  • Forum-Beiträge: 60

27.10.2011, 12:43:59 via Website

Maximilian O
Na du musst einfach in dem onAcc...Chance der Sensoren die Infrastruktur aufrufen. Somit wird es jedesmal aktualisiert.
MfG

könntest du mir vllt genauer erklären wie das geht? am besten mit code, das wäre nett :)

Antworten
Maximilian O
  • Forum-Beiträge: 990

27.10.2011, 20:30:50 via App

Äh, mein rechtschreibprogramm lässt grüßen. Sollte natürlich nicht Infrastruktur heißen sondern onDraw. Hoffe jetzt stimmt alles :)

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Daniel
  • Forum-Beiträge: 60

28.10.2011, 14:27:27 via Website

kannst du mir dann vllt noch erklären was du mit onAcc meinst und wie das geht? ein code beispiel wäre gut

Antworten