Sie sollten die verwenden CameraUpdate
Klasse verwenden, um (wahrscheinlich) alle programmatischen Kartenbewegungen auszuführen.
Berechnen Sie dazu zunächst die Grenzen aller Marker wie folgt:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Erhalten Sie dann ein Bewegungsbeschreibungsobjekt, indem Sie die Fabrik verwenden CameraUpdateFactory
::
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Verschieben Sie zum Schluss die Karte:
googleMap.moveCamera(cu);
Oder wenn Sie eine Animation möchten:
googleMap.animateCamera(cu);
Das ist alles :)
Klarstellung 1
Bei fast allen Bewegungsmethoden muss das Map
Objekt den Layoutprozess bestanden haben. Sie können mit dem addOnGlobalLayoutListener
Konstrukt darauf warten . Details finden Sie in den Kommentaren zu dieser Antwort und den verbleibenden Antworten. Sie können auch einen finden vollständigen Code für die Einstellung der Kartenausdehnung mit addOnGlobalLayoutListener
hier .
Klarstellung 2
In einem Kommentar wird darauf hingewiesen, dass die Verwendung dieser Methode für nur eine Markierung dazu führt, dass der Kartenzoom auf eine "bizarre" Zoomstufe eingestellt wird (die meiner Meinung nach die maximale Zoomstufe ist, die für einen bestimmten Ort verfügbar ist). Ich denke, das wird erwartet, weil:
- Die
LatLngBounds bounds
Instanz hat eine northeast
Eigenschaft gleich southwest
, was bedeutet, dass der Teil der Erdfläche, der davon bedeckt bounds
ist, genau Null ist. (Dies ist logisch, da ein einzelner Marker keinen Bereich hat.)
- Wenn Sie
bounds
an CameraUpdateFactory.newLatLngBounds
Sie übergeben, fordern Sie im Wesentlichen eine Berechnung einer solchen Zoomstufe an, die bounds
(mit einer Fläche von Null) die gesamte Kartenansicht abdeckt.
- Sie können diese Berechnung tatsächlich auf einem Blatt Papier durchführen. Die theoretische Zoomstufe, die die Antwort ist, ist + ∞ (positive Unendlichkeit). In der Praxis unterstützt das
Map
Objekt diesen Wert nicht, sodass es auf ein vernünftigeres maximales Niveau geklemmt wird, das für einen bestimmten Standort zulässig ist.
Anders ausgedrückt: Wie kann das Map
Objekt wissen, welche Zoomstufe es für einen einzelnen Standort wählen soll ? Möglicherweise sollte der optimale Wert 20 sein (wenn er eine bestimmte Adresse darstellt). Oder vielleicht 11 (wenn es eine Stadt darstellt). Oder vielleicht 6 (wenn es ein Land darstellt). API ist nicht so klug und die Entscheidung liegt bei Ihnen.
Sie sollten also einfach überprüfen, ob markers
nur ein Standort vorhanden ist, und in diesem Fall einen der folgenden Standorte verwenden:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- Gehen Sie zur Markierungsposition und lassen Sie die aktuelle Zoomstufe intakt.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- Gehen Sie zur Markierungsposition und stellen Sie die Zoomstufe auf den willkürlich gewählten Wert 12 ein.
addOnGlobalLayoutListener()
oderpost()
mit einem geeignetenRunnable
. Dies ist genau der Grund, warum das Abrufen von Markierungsbildschirmkoordinaten nicht möglich istonCreate
- siehe stackoverflow.com/q/14429877/1820695. Sie können jedoch einige Methoden verwenden, noch bevor das Layout erstellt wurde - z.CameraUpdateFactory.newLatLngBounds()
mit 4 params .Google Map V2
Die folgende Lösung funktioniert für Android Marshmallow 6 (API 23, API 24, API 25, API 26, API 27, API 28). Es funktioniert auch in Xamarin.
quelle
Damit
Ihre Google Map befindet sich beispielsweise in RelativeLayout:
quelle
Ich konnte den onGlobalLayoutlistener nicht verwenden, daher hier eine andere Lösung, um den
"Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions."
Fehler zu verhindern :quelle
Von diesem Code aus zeige ich mehrere Markierungen mit besonderem Zoom auf dem Kartenbildschirm an.
// Deklarierte Variablen
// Methode zum Hinzufügen mehrerer Markierungspunkte mit zeichnbarem Symbol
// Zum Hinzufügen mehrerer auf der Karte sichtbarer Markierungen
quelle
Hinweis - Dies ist keine Lösung für die ursprüngliche Frage. Dies ist eine Lösung für eines der oben diskutierten Teilprobleme .
Lösung zu @andr Klarstellung 2 -
Es ist wirklich problematisch, wenn sich nur eine Markierung in den Grenzen befindet und die Zoomstufe daher auf eine sehr hohe Stufe eingestellt ist ( Stufe 21 ). Und Google bietet derzeit keine Möglichkeit, die maximale Zoomstufe festzulegen. Dies kann auch passieren, wenn mehr als ein Marker vorhanden ist, diese jedoch alle ziemlich nahe beieinander liegen. Dann tritt auch das gleiche Problem auf.
Lösung - Angenommen, Ihre Karte soll niemals über die Zoomstufe 16 hinausgehen. Dann nach -
Überprüfen Sie, ob Ihre Zoomstufe die Stufe 16 überschritten hat (oder was auch immer Sie wollen) -
Und wenn diese Stufe größer als 16 ist, was nur der Fall ist, wenn weniger Markierungen vorhanden sind oder alle Markierungen sehr nahe beieinander liegen, verkleinern Sie Ihre Karte einfach an dieser bestimmten Position, indem Sie die Zoomstufe auf 16 einstellen.
Auf diese Weise haben Sie nie das Problem der "bizarren" Zoomstufe, das auch von @andr sehr gut erklärt wird.
quelle
Dies würde helfen .. von Google Apis Demos
Für klare Informationen schauen Sie sich diese URL an. https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java
quelle
Ich hatte ein ähnliches Problem. Die Verwendung des folgenden Codes löste das Problem:
CameraUpdateFactory.newLatLngBounds(bounds, 200, 200, 5)
Im Allgemeinen sind die Standortunterschiede in meinem Fall nicht mehr als zwei Nachbarstädte.zoomen, um alle Markierungen auf der Karte Google Maps v2 anzupassen
quelle
Alle Marker mit Google Map anzeigen
Speichern Sie in diesen Methoden alle Markierungen und zoomen Sie automatisch, um alle Markierungen in Google Map anzuzeigen.
quelle
Verwenden Sie die Methode "getCenterCoordinate", um die Mittelkoordinate abzurufen und in CameraPosition zu verwenden.
quelle
Ich habe eine andere Möglichkeit, dasselbe zu tun, funktioniert perfekt. Um alle Markierungen auf dem Bildschirm anzuzeigen, benötigen wir eine mittlere Lat-Länge und eine Zoomstufe. Hier ist die Funktion, die Ihnen beides bietet und alle Latlng-Objekte des Markers als Eingabe benötigt.
Diese Funktion gibt ein Pair-Objekt zurück, das Sie wie verwenden können
Anstatt Polster zu verwenden, um Ihre Markierungen von Bildschirmgrenzen fernzuhalten, können Sie den Zoom um -1 anpassen.
quelle
http://i64.tinypic.com/2qjybh4.png
http://i63.tinypic.com/flzwus.png
http://i63.tinypic.com/112g5fm.png
quelle