vordefinierte Punkte auf virtueller Map auf allen Devices definieren

  • 4 Antworten
  • Letztes Antwortdatum
marine2k

marine2k

Fortgeschrittenes Mitglied
9
Hallo Leute!

Ich hab ein kleines Verständnisproblem:
schreibe gerade eine App, in der diverse Städte(Punkte) auf einer Map z.B. Österreich zu finden sind (durch Klick auf den Punkt auf der Map, wo man denkt, dass sich das gesuchte Ziel(Stadt) befindet

so weit so gut - wie kann ich nun die Punkte so definieren, dass es auf allen Smartphones funktioniert? (Tablets ausgenommen)
dachte eigentlich an Definitionen in dp bzw.:
  • Zielpunkte in dp speichern
  • Touchevents in Pixel --> umwandeln in dp (mit der Formel dp = px / (metrics.densityDpi / 160f);)
  • Abstände zwischen Zielpunkten und Touchevents in dp berechnen

Hab nun aber mal testweise probiert, touchevents in dp umzurechnen auf einem 800x480 und einem 1280x720 Pixel AVD
--> ein punkt in der Mitte der 2 (virtuellen) Screens sollte ja ungefähr die gleichen dp Werte ergeben, tut er aber nicht :(

Ich dachte eigentlich, dass dp-Angaben auf allen Devices die gleichen px-Werte ergeben würden - wichtig z.b. auch für Layout-Definitionen im XML?
Wo ist hier mein Denkfehler?

danke für jeden Tipp!!!!

lg
 
Ich würde in einem transformierten Korrdinatensystem rechnen, in dem das ganze Bild (1,1)-groß ist (mit anderen Worten durch getWidth/Height() teilen).
 
  • Danke
Reaktionen: marine2k
ja das würde natürlich gehen, ich wollte mir den aufwand ersparen und dachte, dass es auch mit dp möglich ist
(hab diese aber scheinbar falsch verstanden - dachte jedes android-device hat einen screen mit 320 x 480 dp? )

und:
die map (von z.b. österreich) hat ja ein bestimmtes verhältnis - wenn ichs jetzt auf allen devices auf den gleichen raum strecke, schauts ja gestreckt aus und nicht mehr soo toll
- zusätzlich dachte ich an eine statusleiste oben mit infos zu derzeitigem punktestand und zeitbalken etc

da sollte ich ja den ganzen screen auf ein koordinatensystem mappen und die einteilung des screens in map/statusleiste dann im koordinatensystem vornehmen?
würde das ganze layout um einiges aufwändiger machen - wenn ichs gerade richtig verstehe!? :)

hier angehängt, wie ichs mir ca. vorgestellt hab
mockupplayaustria1.png
 
Auf den ganzen Screen zu rechnen ist keine so gute Idee - da musst du dich dann ja mit allen Widgets auf dem Schirm herumärgern. Das Problem mit dem Seitenverhältnis hast du ohnehin, egal wie du die Koordinaten berechnest.

Um das Seitenverhtnis deines Bildes zu zu erhalten, kannst du dir die Höhe und Breite deines Canvas holen und dann ausrechnen, wie hoch du es skalieren musst, damit es unverzerrt im Canvas landet. Also sowas in der Art:

Code:
float cw = canvas.getWidth();
float ch = canvas.getHeight();
float bh = bitmap.getWidth();
float bw = bitmap.getHeight();
float sx = cw/bw;
float sy = ch/bh;
float scale = Math.min(sx,sy);
 
Hi Marine2k!

Zuerst einmal: nein, nicht alle Android Geräte haben 320x480 dp. Das kann ja auch gar nicht sein, weil das Seitenverhältnis nicht auf allen Geräten gleich ist.

DP ist lediglich eine Einheit, die es einfach möglich macht z.B. eine Grafik auf allen Geräten gleich groß erscheinen zu lassen.
Lies dir mal am besten zu diesem Thema diesen Artikel durch: Supporting Multiple Screens | Android Developers

Ich benutze immer die Eigenschaft "density" des DiplayMetrics-Objects um von Pixel zu Dp oder andersrum die Pixel zu errechnen.

px = dp * density
und
dp = px / density

Wenn du deine Grafik Viewfüllend darstellen willst, wirst du wohl nicht drum rum kommen, wie es DieGoldeneMitte ganz richtig erkannt hat, deine Scalierung zu berechnen. Ist auch gar nicht so kompliziert.
Nimm einfach ein LinearLayout mit verticaler Orientierung. Als erstes fügst du deine View (FILL_PARENT, WRAP_CONTENT) mit den Punkten und Co hinzu und dann eine ImageView (FILL_PARENT, FILL_PARENT. Die beiden Views werden somit untereinander angezeigt.
Ich nehme an, du hast ein Bild von Österreich, dass x mal y Pixel groß ist. Und die Koordinaten der Stadt hast du wahrscheinlich auch Pixeln vorliegen.

Nimm dann einfach die ImageView mit ScaleType = CENTER_INSIDE. Dann sollte eine Seite immer bildschirmfüllend sein. Somit wird Österreich dann immer komplett sichtbar dargestellt.
Dann rechnest du das Scalingfaktor aus mit original Bildbreite / ImageVIew Breite.
Und fügst zu der ImageView einen OnTouchListener hinzu.
Wenn dann der Bentzter auf die Karte tippt, bekommst du in onTouch die Koordinaten in Pixeln und kannst diese dann mit den Koordinaten deiner Stadt Mal deinen Scalingfactor vergleichen und du weißt wie dicht man dran war.

Gruß Harry
 
Zuletzt bearbeitet:
Zurück
Oben Unten