Frage

Ich verwende eine angepasste Version der Kartenansicht (OSMDroid-Version). Ich verwende darin benutzerdefinierte Kacheln und möchte nur, dass der Benutzer den Bereich anzeigen kann, in dem ich meine benutzerdefinierten Kacheln habe. Gibt es eine Möglichkeit, die Grenzlängen so festzulegen, dass sie beim Schwenken der Karte nicht über diese Grenzen hinausgehen?

War es hilfreich?

Lösung 3

Falls es jemandem hilft ....

Ich habe eine Art Lösung, die ich verwende, sie funktioniert in Ordnung, könnte aber definitiv besser sein, da die Karte zu weit vom Bildschirm entfernt sein kann, bevor sie zurückspringt! Es verwendet die Lat-Longs und berechnet, wo sich die Karte befindet. Ich habe 4 Koordinaten festgelegt, die ungefähr den 4 Ecken der Karte entsprechen. Ich habe festgestellt, dass es besser funktioniert, wenn Sie sie leicht in die Karte einfügen, ziemlich genau die Ecken. Ich arbeite dann aus, wenn Die Lat Longs haben den Bildschirm vollständig verlassen. Wenn ja, wird er auf halber Strecke zurückgeworfen:

Ich habe die Kartenansicht und das OnTouch-Ereignis der Karte überschrieben.

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_UP) {

        // (only works for north of equator)
        // * map right side (lat) can't go past the left (lat) of screen

        // get geopoints of the 4 corners of the screen
        Projection proj = getProjection();
        GeoPoint screenTopLeft = proj.fromPixels(0, 0);
        GeoPoint screenTopRight = proj.fromPixels(getWidth(), 0);
        GeoPoint screenBottomLeft = proj.fromPixels(0, getHeight());

        double screenTopLat = screenTopLeft.getLatitudeE6() / 1E6;
        double screenBottomLat = screenBottomLeft.getLatitudeE6() / 1E6;
        double screenLeftlong = screenTopLeft.getLongitudeE6() / 1E6;
        double screenRightlong = screenTopRight.getLongitudeE6() / 1E6;

        double mapTopLat = BoundsTopLeftCorner.getLatitudeE6() / 1E6;
        double mapBottomLat = BoundsBottomLeftCorner.getLatitudeE6() / 1E6;
        double mapLeftlong = BoundsTopLeftCorner.getLongitudeE6() / 1E6;
        double mapRightlong = BoundsTopRightCorner.getLongitudeE6() / 1E6;

        // screen bottom greater than map top
        // screen top less than map bottom
        // screen right less than map left
        // screen left greater than map right
        boolean movedLeft = false;
        boolean movedRight = false;
        boolean movedUp = false;
        boolean movedDown = false;

        boolean offscreen = false;
        if (screenBottomLat > mapTopLat) {
            movedUp = true;
            offscreen = true;
        }
        if (screenTopLat < mapBottomLat) {
            movedDown = true;
            offscreen = true;
        }
        if (screenRightlong < mapLeftlong) {
            movedLeft = true;
            offscreen = true;
        }
        if (screenLeftlong > mapRightlong) {
            movedRight = true;
            offscreen = true;
        }

        if (offscreen) {
            // work out on which plane it's been moved off screen (lat/lng)

            if (movedLeft || movedRight) {

                double newBottomLat = screenBottomLat;
                double newTopLat = screenTopLat;

                double centralLat = newBottomLat
                        + ((newTopLat - newBottomLat) / 2);
                if (movedRight)
                    this.getController().setCenter(
                            new GeoPoint(centralLat, mapRightlong));
                else
                    this.getController().setCenter(
                            new GeoPoint(centralLat, mapLeftlong));

            }
            if (movedUp || movedDown) {

                // longs will all remain the same
                double newLeftLong = screenLeftlong;
                double newRightLong = screenRightlong;

                double centralLong = (newRightLong + newLeftLong) / 2;

                if (movedUp)
                    this.getController().setCenter(
                            new GeoPoint(mapTopLat, centralLong));

                else
                    this.getController().setCenter(
                            new GeoPoint(mapBottomLat, centralLong));
            }

        }

    }
    return super.onTouchEvent(ev);
}}

Ein paar Dinge, auf die ich hinweisen sollte, wenn Sie dies in Betracht ziehen:

  1. Ich garantiere nicht, dass es für Ihre Situation funktioniert, und Sie sollten es nur als Ausgangspunkt verwenden.
  2. Aufgrund der Art und Weise, wie ich die Koordinaten erstellt habe, funktioniert es nur für Gebiete nördlich des Äquators (glaube ich)!
  3. Es funktioniert bei der "Aktion nach oben" des Berührungsereignisses, also nimmt es den Punkt, an dem der Benutzer seinen Finger vom Bildschirm nimmt. Das heißt, wenn die Karte schleudert, ist sie völlig ungenau, da ich nicht herausfinden konnte, wo die Karte angehalten hat. Aus diesem Grund habe ich den Schleudervorgang ausgeschaltet, indem ich das Schleuderereignis überschrieben und nichts darin getan habe. Dies macht die Karte ein bisschen ruckelig!

    Wenn jemand bessere Lösungen hat oder meinen Code verbessern kann, fühlen Sie sich bitte frei!

Andere Tipps

Update: Ich weiß, dass dies eine alte Frage ist, aber osmdroid verfügt jetzt über eine setScrollableAreaLimit () -Methode, mit der das erreicht wird, wonach Sie suchen.Es gibt auch die Methoden setMinZoomLevel () und setMaxZoomLevel (), um die Zoomstufen einfach einzuschränken.

Ursprüngliche Antwort:

Bitte beachten Sie:

http://code.google.com/p/osmdroid/Probleme / Details? id= 209

Ein Patch wurde bereits erstellt und wird wahrscheinlich in Kürze integriert.

Dies ist ein Cross-Posting von dem Osmroid-Thread .Es gibt jetzt eine BoundedMapView-Klasse, die den oben genannten Patch implementiert.

Für Benutzer, die die .jar verwenden oder auf andere Weise nicht so vertraut sind Patches habe ich eine Unterklasse von MapView zusammengeschustert, die unterstützt Beschränken der Benutzeransicht auf einen bestimmten Bereich.

Details zur Verwendung, wenn nicht offensichtlich, finden Sie unter http://www.sieswerda.net/2012/08/15 / boundedmapview-a-mapview-with-limit /

Ich suche genau das Gleiche.

Am besten füge ich ein Overlay hinzu, das den boolean onScroll(...) erweitert.Wenn dies true zurückgibt, wird der Bildlauf abgebrochen.

Genau so will ich es, bis auf eines: Schleudern / Schnippen.Der gleiche Ansatz kann verwendet werden, um Fling-Ereignisse abzubrechen, obwohl Sie erst zu Beginn des Flings davon erfahren.

Idealerweise können Sie die computeScroll()-Methode anhören und den (x, y) der Schriftrolle basierend auf mScroller.getCurX() und mScroller.getCurY() einschränken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top