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.