Canvas und Bitmap: Er zeichnet nicht da wo er soll

  • Antworten:6
  • Bentwortet
FeGe
  • Forum-Beiträge: 14

13.05.2011, 19:59:04 via Website

Hallo,
Ich wende mich an euch mit einer Frage, die vermutlich trivial ist, die aber auch nach 5 Stunden googlen nicht so beantwortet ist, dass es funktioniert. Folgendes vorweg: Ich habe ein Programm, das in einem ImageView ein Bild mit den Abmessungen 400x545 anzeigt. In der Layout-XML habe ich angegeben, das es auch mit exakt dieser Größe angezeigt werden soll

1<ImageView
2android:layout_width="400dip"
3android:layout_height="545dip"
4android:src="@drawable/map"
5android:id="@+id/image"
6android:layout_alignParentRight="true"
7android:layout_alignParentTop="true" />

Soweit so gut. Im Programm hole ich mit dann das Bitmap und erzeuge damit ein neues Canvas. Auf dem Bild, das ist eine Karte, möchte ich nun Regionen einzeichnen. Für die Regionen habe ich mir einen int-Array gebaut, das funktioniert auch soweit, er zeichnet eine Region. Leider hat die Region nichts mit den eingegeben Abmessungen zu tun. Ich bin dabei wie folgt vorgegangen:
  1. Mit Paint eine Liste von Punkten erstellen, zB 292/64, 287/116 usw
  2. Das Programm zeichnet nun mit drawPath() entsprechende Pfade

Leider ist die gezeichnet Region viel zu klein und sitzt ganz woanders. Also hab ich mir mal über den Emulator die XY-Koordinaten durch Wausklick geholt. Da kommen dank Density und Co ganz andere Werte raus. Die passen aber genauso wenig. Dann habe ich lange gegoogelt, Dinge gefunden wie TypedValue.applyDimension(), habe selber versucht den Skalierungsfaktor zu errechnen. Das hatte alles keinen Erfolg und ich weiß nicht wieso...

Vielleicht könnt ihr mir ja helfen, wie ich auflösungsunabhängig meinen Regionen übertragen kann. Schon einmal vielen Dank im Vorraus.

Liebe Grüße,
Felix

Antworten
Dark Blood Studios
  • Forum-Beiträge: 203

13.05.2011, 21:09:36 via Website

Wird denn das Bild überhaupt in der richtigen Größe angezeigt?

— geändert am 13.05.2011, 21:36:21

Antworten
FeGe
  • Forum-Beiträge: 14

14.05.2011, 19:55:12 via Website

Hallo,
Leider auch nicht, das Bild ist 400x545 Pixel groß, im Programm habe ich dann mal die Width und Height besorgt, dass sind 533x725 gewesen. Ich habe jetzt für den Emulator erstmal einen festen Skalierungsfaktor verwendet, 1.33. Mit dem funktioniert es jetzt, dabei habe ich genau diesen Wert zuvor berechnet, aber da mochte er ihn nicht. Alles merkwürdig.

Antworten
Dark Blood Studios
  • Forum-Beiträge: 203

14.05.2011, 23:05:34 via Website

In welchem Ordner hast du das Bild? Mach es mal in den Ordner ".../res/drawable-nodpi", dann müsste es richtig geladen werden. Wenn der Ordner nicht vorhanden ist erstelle ihn einfach neu.

Wenn du das Bild in ".../res/drawable-hdpi", ".../res/drawable-mdpi" oder ".../res/drawable-ldpi" hast wird es automatisch beim laden scalliert.

— geändert am 14.05.2011, 23:07:44

Antworten
FeGe
  • Forum-Beiträge: 14

15.05.2011, 23:56:31 via Website

Ah, so ein böser Ordner. Stimmt, mit einem Ordner 'nodpi' macht er nicht am Bild rum. Vielen Dank für den Tipp.

Gute Nacht,
Felix

Antworten
Dark Blood Studios
  • Forum-Beiträge: 203

16.05.2011, 07:04:51 via Website

Wird der Rest jetzt auch an die richtige Stelle des Bildes gezeichnet?

Antworten
FeGe
  • Forum-Beiträge: 14

16.05.2011, 09:23:33 via Website

Hallo,
Ja, letztlich zeichnet er dann genau dahin, wo es auch hin soll. Im Nachhinein ist das natürlich blöd, weil die App soll ja verschiedene Auflösungen abdecken können, zum Testen war es so natürlich einfacher. Die endgültige Lösung platziert das Bild nun mit maximal möglicher Breite auf dem Bildschirm und ich rechne die Pixel-Koordinaten um. Ich weiß ja wie groß das Bild bei meine X-Y-Pixelmessungen war und kann mir die aktuelle Größe des Bitmaps mit width und height holen. Dann rechne ich meinen Skalierungs-Faktor aus.

Sowas gibt es ja auch schon, MScale und einige Funktionen von BitMap, aber die lieferten alle immer 1.0 als Skalierungsfaktor. Vermutlich weil der das Bild vorher schon skaliert und danach nichts mehr macht. Ob das jetzt mit "nodpi" den richtigen Wert liefern würde habe ich nicht ausprobiert.

Gruß,
Felix

Antworten