1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

custom MapView

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Andr_green, 18.05.2012.

  1. Andr_green, 18.05.2012 #1
    Andr_green

    Andr_green Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    2
    Registriert seit:
    24.11.2011
    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)
     
  2. Unicate, 23.05.2012 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    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.
     
  3. Andr_green, 23.05.2012 #3
    Andr_green

    Andr_green Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    2
    Registriert seit:
    24.11.2011
    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
     
  4. Unicate, 23.05.2012 #4
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Wenns gar nicht geht, musst du den onTouch der ImageView überschreiben und selber behandeln. das ist nicht so schwer wie's sich anhört.
     
  5. Andr_green, 23.05.2012 #5
    Andr_green

    Andr_green Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    2
    Registriert seit:
    24.11.2011
  6. Unicate, 23.05.2012 #6
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
  7. Andr_green, 23.05.2012 #7
    Andr_green

    Andr_green Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    2
    Registriert seit:
    24.11.2011
    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....
     
  8. Unicate, 23.05.2012 #8
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    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.
     
  9. Andr_green, 23.05.2012 #9
    Andr_green

    Andr_green Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    2
    Registriert seit:
    24.11.2011
    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
     
  10. Unicate, 23.05.2012 #10
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Ich versteh Dein Problem nicht. Der Code sieht soweit gut aus.
    Was ist denn nicht gewünscht?
    Skaliert es falsch?
     
  11. Andr_green, 23.05.2012 #11
    Andr_green

    Andr_green Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    2
    Registriert seit:
    24.11.2011
    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.
     
  12. Andr_green, 24.05.2012 #12
    Andr_green

    Andr_green Threadstarter Junior Mitglied

    Beiträge:
    40
    Erhaltene Danke:
    2
    Registriert seit:
    24.11.2011
    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.
     

Diese Seite empfehlen