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 MapObjekt den Layoutprozess bestanden haben. Sie können mit dem addOnGlobalLayoutListenerKonstrukt 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 addOnGlobalLayoutListenerhier .
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 boundsInstanz hat eine northeastEigenschaft gleich southwest, was bedeutet, dass der Teil der Erdfläche, der davon bedeckt boundsist, genau Null ist. (Dies ist logisch, da ein einzelner Marker keinen Bereich hat.)
- Wenn Sie
boundsan CameraUpdateFactory.newLatLngBoundsSie ü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
MapObjekt 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 MapObjekt 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 markersnur 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.