custom MapView

A

Andr_green

Neues Mitglied
2
Hallo,

ich habe eine kleine Aufgabe uns überlege ob es nicht möglich ist dies mit einer MapView zu realisieren. Allerdings weiss ich nicht ob dies möglich ist daher meine Frage an euch.

Ich möchte ein Bild in der orginal Auflösung darstellen und auf diesem, mit festen Koordinaten, Punkte markieren. Ebenfalls soll es möglich sein dieses Bild zu scrollenund zu zoomen und ein Dialog anzuzeigen mit Infos zu dem spez. Punkt.
Das sind alles Dinge die eine MapView kann, daher meine Frage kann eine MapView ein anderes Bild als Grundlage nehmen ??
Oder muss das alles mit einer View realisiert werden??
Schon mal vielen Dank für eure Hilfe.

Lg Andr

(P.S. Ich habe schon im Netz gesucht aber keine Antwort auf diese Frage erhalten)
 
Für's scrollen und zoomen benötigt man nicht unbedingt eine MapView
Bei deinem Problem enstehen mehrere Probleme

Ist das Bild so groß? Eine MapView basiert ja auf vielen kleinen Bildchen, von denen Teile, bei bedarf "vergrößert", also neu geladen werden müssen, da im Hauptspeicher relativ wenig Platz ist. (16MB sollten nicht überschritten werden, wenn die App auf allen Phones laufen soll)
Von daher wäre es eine gute Idee eine MapView dafür zu verwenden, allerdings gehört da ein Haufen vorarbeit dazu. Lohnt das?

Prinzipiell sollte es aber möglich sein, schau mal bei anddev.org vorbei, da gab es jemanden der das AndNav gebaut hat. Der hat eine Schnittstelle für die OSM gebaut. Sollte ja ähnlich gehen.

Ich würde trotzdem empfehlen, das mit einer zoombaren ImageView zu machen, da es SEHR viel einfacher zu implementieren ist.
 
Vielen Dank für deine Antwort.
Hatte den Post schon fast vergessen ....
Habe gerade wiedr angefangen mit dem Problem ;-) und bin auch auf eine ImageView
gewächselt.

Ich versuche es gerade mit einer TouchImageView zu realisieren.
Aber hier hat sich gleich das nächste Problem aufgetan....
....ich möchte , dass das Bild von Beginn an vollangezeigt wäre, wie im Scaletype 'Center', allerdings funktioniert dann das touch event nicht mehr...
hast du einen Idee?
Danke
 
Wenns gar nicht geht, musst du den onTouch der ImageView überschreiben und selber behandeln. das ist nicht so schwer wie's sich anhört.
 
Danke, an dem Beispiel war ich auch gerade vorbei gekommen.
Habe es auch schon ausprobiert.
Das Zoomen etc funktioniert, nur leider ist das Bild nicht fest. D.H. Ich bewegen bei Drag auch das Bild (wenn es kleiner ist) über den Bildschirm. Ich hätte es gerne
in der oberen Ecke festgetackert....
 
Dann bleibt dir woh bloß die Möglichkeit, die Klasse zu überschreiben.

onDraw musst du überschreiben, damit du das Bild bei zoom skalieren bzw. translieren kannst
onTouch musst du überschreiben damit du den PinchZoom, bzw. den doppelklick oder was auch immer du zum zoomen verwenden möchtest, erstellen kannst.
 
Danke.

an der OnDraw habe ich schon ein wenig 'gebastelt'.

Aber das Bild verschiebt sich, um den Zoomfaktor * der enstprechenden Displaysize (weite oder höhe).

Code:
@Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            canvas.save();
            canvas.scale(mScaleFactor, mScaleFactor, mLastTouchX, mLastTouchY);

            bm_height = bm.getHeight() * mScaleFactor;
            bm_width = bm.getWidth() * mScaleFactor;

            int newScrollRectY = 0;
            int newScrollRectX = 0;

            // in case the bitmap height is greater then the display
            if (bm_height > displayHeight) {
                newScrollRectY = (int) (scrollRectY - scrollByY);
                // Don't scroll off the top or bottom edges of the bitmap.
                if (newScrollRectY <= 0) {
                    // in case the image is smaller then the display do nothing
                    newScrollRectY = 0;
                } else if (newScrollRectY > (bm_height - displayHeight))
                    // image is larger then the display
                    newScrollRectY = (int) (bm_height - displayHeight);

            } else {
                scrollRectY = 0;
            }

            // in case the width is greater then the display
            if (bm_width > displayWidth) {

                newScrollRectX = (int) (scrollRectX - scrollByX);
                // Don't scroll off the left or right edges of the bitmap.
                if (newScrollRectX <= 0)
                    newScrollRectX = 0;
                else if (newScrollRectX > (bm_width - displayWidth))
                    newScrollRectX = (int) (bm_width - displayWidth);

            } else {
                scrollRectX = 0;
            }
             scrollRect.set(newScrollRectX , newScrollRectY, newScrollRectX +displaywidth, newScrollRectY +displaywidth);

            Paint paint = new Paint();
            canvas.setViewport(right, bottom);
            canvas.drawBitmap(bm, scrollRect, displayRect, paint);
        
            canvas.restore();

            scrollRectX = newScrollRectX;
            scrollRectY = newScrollRectY;

        }


Fällt dir da was auf??
Ich seh glaube ich den Wald vor Bäumen nicht mehr...
Danke schon mal.

LG
 
Ich versteh Dein Problem nicht. Der Code sieht soweit gut aus.
Was ist denn nicht gewünscht?
Skaliert es falsch?
 
das skalieren funktioniert und scheint so weit auch korrekt zu sein.
Das Problem liegt darin, dass das Bild auf das canvas gezeichnet wird -> ok
wenn das Bild um 1,2 skaliert wird, wird der linke Rand um die displaywidth *1,2 nicht angezeigt, ebendso der obere Rand. Dafür wird aber rechts und unten dieser Wert hin zu addiert (--> leer).

Wenn ich es so versuche (onDraw):

Code:
        Bitmap out = Bitmap.createScaledBitmap(bm, (int) bm_width, (int) bm_height, false);         
         canvas.drawBitmap(out, scrollRect, displayRect, paint);
kann es bei zu grossen Bildern zum Absturz der App kommen, aber es würde funktionieren.
 
Hallo,

ich habe noch einmal eine Frage zu diesem Thema.
Wenn das Canvas mit Hilfe von

Code:
canvas.scale(mScaleFactor, mScaleFactor, pivotX, privotY);

skaliert wird, wie oder was genau wäre dann pivotX ????
Da in der Erklärung zu der Methode scale steht:
The x-coord for the pivot point (unchanged by the scale). Das wäre doch der Punkt auf dem Display der das Touch event aufgreift ??!!


Dabei entsteht ein Offset, um dass sich das Bild verschiebt. Wie komme ich an dieses Offset und kann die 'Verschiebung' rückgängig machen ??

Danke der weil.
 

Ähnliche Themen

J
Antworten
2
Aufrufe
986
justinh13
J
J
Antworten
2
Aufrufe
693
JoEntwickler
J
Zurück
Oben Unten