Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

Ausrichtung bzw. Richtung

Das Thema "Ausrichtung bzw. Richtung" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 27.08.2011, 17:38   #1 (permalink)
Neuer Benutzer

Registriert seit: 27.08.2011
Beiträge: 9
Abgegebene Danke: 5
Erhielt 0 Danke für 0 Beiträge
Standard Ausrichtung bzw. Richtung

Hallo Leute,

stecke gerade ein bisschen fest mit meiner App! Funktion soll sein das ein Kompass (ausgehend von der aktuellen Position) sich nach einem Ziel ausrichtet bzw. eben die Nadel auf das Zeil zeigt. Es ist kein Kompass mit Himmelsrichtungen sondern ohne (sodass ich den Kompass selbst nicht drehen muss) aber ich will die Nadel auf das Ziel ausrichten.

Einen normalen kompass hab ich schon hinbekommen(der sich auch aktiv mitdreht) aber eben nicht die ausrichtung auf das Ziel.
Die Daten des Ziels sind Location-Objekte welches latitude und longitude besitzt. Kann mir jemand helfen.


Danke für eure Hilfe!
Anbei der Code:

// Aus Klasse DiscoveR wird statische Variable test durch folgender aufruf //verwendet: test = currentLocation.bearingTo(targetLocation)
// currentLocation ist aktuelle position und targetLocation das Ziel


package de.medieninformatik.discover;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.os.Bundle;
import android.widget.ImageView;

public class Compass extends Activity implements SensorEventListener{

SensorManager sensorManager;
Sensor sensor;
ImageView needleView;
Bitmap compassBitMap;
Bitmap needleBitMap;

Matrix matrix;




@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.compasslayout);

sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTA TION);
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);

needleView = (ImageView) findViewById(R.id.needle);

needleBitMap = BitmapFactory.decodeResource(getResources(), R.drawable.star);
matrix = new Matrix();


}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {

if(event.sensor == sensor){

int winkel = (int) event.values[0];
//Prüfen, ob Winkel größer oder kleiner als 180 Grad
int swinkel = -winkel+(winkel>180? 360: 0);

matrix.setRotate(DiscoveR.test);

compassBitMap = Bitmap.createBitmap(needleBitMap, 0, 0, needleBitMap.getWidth(), needleBitMap.getHeight(), matrix, true);
needleView.setImageBitmap(compassBitMap);


}

}
}
DiscoveR ist offline   Mit Zitat antworten
Alt 28.08.2011, 15:15   #2 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Okay, das ganze ist für mich etwas undurchsichtig, aber ich denke du hast einen Denkfehler drin.


bearingTo() liefert dir einen Winkel von Nord aus gesehen rechtsrum drehend. Sagen wir also du bist in Frankfurt am Main und willst nach Berlin, und behaupten mal das wären genau 50° Winkel von Nord aus gesehen. Jetzt zeigt dein Handy gerade genau nach Osten. Das fängst du ja sogar in onSensorChanged ab. Den Winkel (wenn das Gerät nach Osten schaut 90°) benutzt du dann aber lustigerweise nicht weiter
Du brauchst getbearing-swinkel.
FelixL ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei FelixL für diesen Beitrag:
DiscoveR (30.08.2011)
Alt 29.08.2011, 11:47   #3 (permalink)
Neuer Benutzer

Registriert seit: 27.08.2011
Beiträge: 9
Abgegebene Danke: 5
Erhielt 0 Danke für 0 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Hallo,
danke für deine Antwort. Sorry das es so verwirrend war :-) aber ich war schon echt am Ende ^^ .

Du hast das schon richtig verstanden. Ursprünglich wurde dem Aufruf matrix.setRotate(....); auch swinkel als Pamarameter übergeben also matrix.setRotate(swinkel); aber dann ist es ja nur ein "normaler" Kompass der immer nach norden zeigt aber ich will so zu sagen einen eigenen Norden definieren bzw. will dass sich die Nadel nach einem Ziel ausrichtet .
Von diesem Ziel habe ich die Längen und Breitengrade und habe daraus eine Location gemacht und wollte mit der bearingTo() den Winkel zu dieser Location rausbekommen - diesen vermeindlichen Winkel habe ich in der Variablen test gspeichert und dann der setRotate(test); übergeben.

Vielleicht könntest du mir helfen wie ich der Nadel sage dass sie sich nach dem Ziel ausrichten soll bzw. manuell den Norden festlegen kann:-)

Vielen Dank!
DiscoveR ist offline   Mit Zitat antworten
Alt 29.08.2011, 12:00   #4 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Und ich wette deine Nadel zeigt durchgehend den selben Winkel an, egal wohin du das Gerät drehst. Kannst ja testweise mal ein genau nördliches oder südliches Ziel nehmen, ob die Nadel dann genau nach oben oder unten zeigt.


matrix.setRotate(DiscoveR.test-swinkel);
könnte schon reichen.
Erklärung siehe oben. Du erhältst zwar vom Gerät die Info wie weit das Gerät vom Norden aus gedreht ist (swinkel) und die Info in welche Richtung es genau gedreht sein soll damit es aufs Ziel zeigt (getBearing), verknüpfst die dann aber nicht. logischerweise musst du beide benutzen.
Musst vielleicht nochmal schauen wegen negativen Werten, wie du es obendrüber auch gemacht hast.


Edit: Wenn das nicht funktioniert, kannst du den restlichen Sourcecode auch nochmal posten damit ich das nachbauen kann?
FelixL ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei FelixL für diesen Beitrag:
DiscoveR (30.08.2011)
Alt 29.08.2011, 12:22   #5 (permalink)
Neuer Benutzer

Registriert seit: 27.08.2011
Beiträge: 9
Abgegebene Danke: 5
Erhielt 0 Danke für 0 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Danke!

Prinzipiell haben wir 2 Klassen : 1)DiscoveR und 2) Compass

Das Problem ist das das Programm schon bei dem Aufrauf aus der Klasse DiscoveR:



startButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

targetLocation.setLatitude(12.0);
targetLocation.setLongitude(49.0);



test = currentLocation.bearingTo(targetLocation);



Intent i = new Intent(DiscoveR.this, Compass.class);
startActivity(i);

}
});

also wenn ich die testlocation einfach mal willkührlich setzte und dann dazu bearing berechne stürzt es ab ! Ist die Einheit falsch muss ich das Umwandeln ?

Die aktuelle Position ermitteln wir über GPS mit dem Methodenaufruf (etc.) locationManager.getLastKnownLocation(provider) + requestLocationUpdates(...) und mit allen dazugehörigen Methoden.

Danke für die Hilfe . Könnte es dir schon schicken aber es ist viel und will deine hilfe auch nicht ausnützen ! GlG
DiscoveR ist offline   Mit Zitat antworten
Alt 29.08.2011, 12:31   #6 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Ach so, es stürzt ab? Ich dachte es richtet sich nur nicht aus
In diesem Fall hilft erst mal Logcat.
Entweder im Terminal adb logcat, oder in Eclipse (bei mir auf Englisch):
Window-->Show View--> Other-->Android-->LogCat


Dabei muss entweder der Emulator an sein oder das Gerät über USB an den PC angeschlossen sein (was es ja wahrscheinlich sowieso schon ist). Außerdem natürlich USB-debugging aktiviert (was genauso wahrscheinlich sowieso schon aktiviert ist ).
Dann einmal den Fehler auslösen (hier durch App-Aufruf), und es erscheint eine meistens ziemlich klare Aussage was nicht passt.
FelixL ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei FelixL für diesen Beitrag:
DiscoveR (30.08.2011)
Alt 29.08.2011, 13:15   #7 (permalink)
Neuer Benutzer

Registriert seit: 27.08.2011
Beiträge: 9
Abgegebene Danke: 5
Erhielt 0 Danke für 0 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Also hab die targetLocation belegt um damit zu arbeiten . jetzt stürtzt es zumindest nicht mehr ab! :-) Teilerfolg! ;-)

targetLocation = new Location(LocationManager.GPS_PROVIDER);
startButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Log.d(TAG, "Im klick Listener");

targetLocation.setLatitude(49.0072919);
targetLocation.setLongitude(12.1192548);

Log.d(TAG, "Zielposition gesetzt ?");

test = currentLocation.bearingTo(targetLocation);
Log.d(TAG, "Bearing berechnet");


Intent i = new Intent(DiscoveR.this, Compass.class);
startActivity(i);

}
});

Ok dann´habe ich das was due eben gesagt hast eingearbeitet :


public void onSensorChanged(SensorEvent event) {

if(event.sensor == sensor){

int winkel = (int) event.values[0];
//Prüfen, ob Winkel größer oder kleiner als 180 Grad
int swinkel = -winkel+(winkel>180? 360: 0);

matrix.setRotate(DiscoveR.test-swinkel);

compassBitMap = Bitmap.createBitmap(needleBitMap, 0, 0, needleBitMap.getWidth(), needleBitMap.getHeight(), matrix, true);
needleView.setImageBitmap(compassBitMap);


}
Jetzt funktioniert es aber immer noch nicht ganz : die Nadel ruckelt so und zeigt es nicht richtig an ... also als ich das smartphone gedreht habe ging es mal kurzzeitg :-( kann das an dem Bild für die Nadel liegen bzw. an dessen Größe?
DiscoveR ist offline   Mit Zitat antworten
Alt 29.08.2011, 16:21   #8 (permalink)
Neuer Benutzer

Registriert seit: 27.08.2011
Beiträge: 9
Abgegebene Danke: 5
Erhielt 0 Danke für 0 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Hallo habs jetzt hinbekommen: Fehler waren:

1) Die größe der Kompass Nadel (einfach zu groß)

2)matrix.reset(); hilft alles schneller zu machen : hab sie in der onSensorChanded(..) eingebaut!

Danke nochmal!
DiscoveR ist offline   Mit Zitat antworten
Alt 29.08.2011, 16:41   #9 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Zitat:
die Nadel ruckelt so und zeigt es nicht richtig an ... also als ich das smartphone gedreht habe ging es mal kurzzeitg :-( kann das an dem Bild für die Nadel liegen bzw. an dessen Größe?

Könnte auch daran liegen das du z.B. die Matrix auf 45° gedreht hast, jetzt willst du sie auf 46° drehen, und drehst sie dabei nochmal um 46° statt um 1°. Bin mir aber nicht sicher wie das Matrix.rotate funktioniert. Das würde aber erklären warum matrix.reset funktioniert hat, dann würdest du nämlich wieder bei 0° beginnen.
FelixL ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei FelixL für diesen Beitrag:
DiscoveR (30.08.2011)
Alt 29.08.2011, 17:29   #10 (permalink)
Neuer Benutzer

Registriert seit: 27.08.2011
Beiträge: 9
Abgegebene Danke: 5
Erhielt 0 Danke für 0 Beiträge
Standard AW: Ausrichtung bzw. Richtung

Ok jetzt haben wir es getestet - draußen ! Also bis zu einem bestimmten Grad stimmt es aber dann schlägt es genau ins Gegenteil! Weiß nicht wie die Rechnung genau aussehen muss wegen des Bearing-Wertes ! Wird dieser in Abhängigkeit zum Norden Berechnet oder nicht?

Hab mir gedacht dass es in Abhängigkeit von bearingTo (test) zu berechnen ist also, ob bearingTo() ( bezw. die Variable test) positiv oder negativ ist aber irgendwas scheint da nicht zu stimmen ! Kannst du mir da nochmal helfen!


@Override
public void onSensorChanged(SensorEvent event) {



if(event.sensor.getType() == sensor.TYPE_ORIENTATION){





int winkel = (int) event.values[0];
//Prüfen, ob Winkel größer oder kleiner als 180 Grad
int swinkel = -winkel+(winkel>180? 360: 0);



if(DiscoveR.test >0){
matrix.reset();
matrix.setRotate(DiscoveR.test+swinkel);
}

else{
matrix.reset();
matrix.setRotate(DiscoveR.test-swinkel);

}
compassBitMap = Bitmap.createBitmap(needleBitMap, 0, 0, needleBitMap.getWidth(), needleBitMap.getHeight(), matrix, true);
needleView.setImageBitmap(compassBitMap);


}
DiscoveR ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Automatische Ausrichtung Kaputt sven-ola Samsung Galaxy Tab Forum 6 12.03.2012 10:11
automatische Ausrichtung Pinocchio Samsung Galaxy S (I9000) Forum 9 23.09.2011 13:07
Homescreen automatische Ausrichtung?! Manfred Samsung Galaxy S2 (I9100) Forum 1 26.05.2011 09:47
TableRow Ausrichtung joschika77 Android App Entwicklung 1 28.05.2009 15:33
Ausrichtung Rotation Homescreen skywalka HTC Magic Forum 7 14.05.2009 11:38




Du liest gerade: "Ausrichtung bzw. Richtung" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.