Konzeptionelle Frage. Zoombare Karte zeichnen mit Canvas ohne Canvas.scale()

  • Antworten:7
mcfly
  • Forum-Beiträge: 286

25.03.2013, 18:57:38 via Website

Hallo zusammen

Hat mir jemand einen Tip für mein Vorhaben:

Ich habe eine Weltkarte, die ich darstelle und in die ich auch zoomen kann. Die Weltkarte besteht aus Pfaden ( z.Bsp. die Kontinente ).
Es gibt Funktionen zum rein- und rauszoomen. Die Pfade zeichne ich ganz einfach mit canvas.drawPath().
Das Zoomen habe ich bisher immer ganz einfach mit canvas.scale(x,y) erreicht.

Seit meinem JellyBean-Update habe ich bemerkt, dass nach dem scaling die Kanten der Pfade sehr ungenau werden. Es scheint, dass der Pfad nicht neu gezeichnet wird ( Vectorized )
sondern die Linie als Bitmap aufscaliert wird. Es hat sich grundsätzlich was geändert. Darum vermute ich, dass mein bisheriger Ansatz falsch war.

Ich bin mir nicht sicher, ob mein 2. Ansatz in die richtige Richtung geht.
Beim zoomen verzichte ich auf canvas.scale() und transformiere meine Pfad mit Matrix.scale(x,y);Path.transform(Matrix);
Das gelingt mir zwar zurzeit noch nicht richtig. Es geht mir aber mehr ums Konzept.
Ich möchte einfach verhindern, dass ich die Pfade neu erstelle. Denn das ist schlecht für die Performance.

Hat jemand einen Tip/Vorschlag/Denkanstoss, wie man das gut lösen kann ?

Liebe Grüsse

Antworten
Appsoluts
  • Forum-Beiträge: 304

25.03.2013, 23:30:55 via Website

Kannst du deine "Weltkarte" nicht in einer Webview darstellen ?
Dann hättest du Zoomfunktionen usw schon integriert.
Ob eine Webview beim Zoomen skaliert oder wie diese die Grafiken darstellt, weiß ich allerdings nicht.

Andernfalls würde ich einfach alle relevanten Pfade, nach vollendetem Zoomen neu zeichnen lassen !?

Antworten
mcfly
  • Forum-Beiträge: 286

26.03.2013, 13:45:42 via Website

Danke für Deine Hilfe.
Nein eine Webview kommt leider nicht in Frage, aber sonst wäre das eine gute Idee :-) Ich möchte eine Custom View erstellen.
Ich zeichne auch noch andere Elemente in meine View ( GUI, Animationen usw...)

Ich möchte auch wie erwähnt nicht die Pfade neu aufbauen, wegen schlechter Performance. ( das habe ich
schon geprüft )

Vor meinem Update auf JellyBean funktionierte meine Kartendarstellung flüssig mit canvas.scale().
D.h. einfach canvas auf die richtige Scalierung setzen und die im bereits vorhandenen Pfade neu zeichen, ohne die
Pfade neu aufzubauen.
Ab JellyBean sind die Kanten verpixelt ( Ich gehe davon aus, dass der Pfad als Bitmap abgelegt wird und dann erst aufskaliert )
D.h. canvas.scale() kommt auch nicht in Frage, ausser ich mache eventuell was falsch damit ?

Hat nochjemand eine Tip/Ansatz ?

Grüsse

Antworten
mcfly
  • Forum-Beiträge: 286

26.03.2013, 17:29:38 via Website

Hallo zusammen,

Mein 2. Ansatz ist auch nicht das richtige.
Wenn ich die Pfade nach oben skaliere entstehen riesige Flächen, die dann nicht mehr dargestellt werden können. D.h. auch wenn ich beim zoomen die Pfade neu erstellen würde, könnte man diese auch nicht mehr darstellen. -> "Shape path too large to be rendered into a texture"

Ich verstehe die Welt echt nicht mehr. Vor JeallyBean lief alles sauber und flüssig mit Riesenflächen und Canvas.scale() als Zoomfunktion. Jetzt wird beim Zoomen alles verpixelt und langsam. Ich denke da müssten doch viele andere auch diese Probleme haben ?

Hier ein Beispiel von Istanbul. Kanten waren vor dem JellyBean Update ( 4.0.4 ) scharf und die Karte liess sich flüssig mit dem Finger bewegen.
Jetzt mit 4.1.2 unscharf wie im Bild und alles ruckelt. ( Und am Code echt nichts geändert )

— geändert am 26.03.2013, 17:53:01

Antworten
mcfly
  • Forum-Beiträge: 286

26.03.2013, 20:39:22 via Website

Liebe Leute

Danke für alle, die sich mit diesem Thema beschäftigt haben. Ich habe mein Ursprungsproblem gefunden und ich brauche gar kein neues Konzept.
Entschuldigt die Zeitverschwendung :-) Ich hoffe jemandem der in die gleiche Falle tappt jetzt weiterhelfen zu können :

Das Problem der Verpixelung und der Performanceeinbusse liegt an der Defaulteinstellung der Hardwareaccelaration ab gewissen API-Level. Vor JellyBean war diese ausgeschaltet. Jetzt mit 4.1.2 musste ich im AndroidManifest.xml explizit folgendes ergänzen:

1android:hardwareAccelerated="false"

Danke an alle und hoffe damit jemandem helfen zu können...

Antworten
Appsoluts
  • Forum-Beiträge: 304

27.03.2013, 00:53:28 via Website

Ha... diese HardwardareAccelerated lässt Webvies auch eckelig schwarz flackern !

Antworten
Phil G.
  • Forum-Beiträge: 86

29.03.2013, 02:42:20 via Website

Erst einmal Danke für diesen Tipp, ist ja ein nerviger Bug (kannte das bisher auch nur vom WebView und dem Transparenzproblem)

Ich hätte mal eine Frage. Im Grunde benötige ich solch einen Customview (Zoombare OfflineMap) wie du ihn gerade am schreiben bist. (Ich habe aber selber noch nicht angefangen, da ich es erst im Sommer zum nächsten größeren Update fertigstellen wollte.
Ich bräuchte jetzt aber nicht die Welt sondern lediglich Deutschland und das ganze zum Zoomen.

Daher meine Frage, woher hast du die Koordinaten/Pfade für deine Weltkarte herbekommen ???

Antworten
mcfly
  • Forum-Beiträge: 286

11.05.2013, 13:22:36 via App

sorry, dass ich erst jetzt antowrte. Ich habe das erst jetzt gesehen.
es gibt bestimmt irgendwo ein eine svg datei im Internet oder kommerziell.

Ich habe eine svg Weltkarte , allerdings etwas ungenau. Ich überlege mir die Karte selber zu zeichnen. Gopg
emaps als Vorlage und dann in eonem Svg Tool nachzeichnen. Ich schaetze einen Tag Aufwand.

gruesse

Phil G.

Antworten