Dovresti usare la CameraUpdateclasse per fare (probabilmente) tutti i movimenti della mappa programmatica.
Per fare ciò, prima calcola i limiti di tutti i marker in questo modo:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Quindi ottenere un oggetto descrizione del movimento utilizzando la fabbrica CameraUpdateFactory::
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Infine sposta la mappa:
googleMap.moveCamera(cu);
O se vuoi un'animazione:
googleMap.animateCamera(cu);
È tutto :)
Chiarimento 1
Quasi tutti i metodi di movimento richiedono che l' Mapoggetto abbia superato il processo di layout. Puoi aspettare che ciò accada usando il addOnGlobalLayoutListenercostrutto. I dettagli sono disponibili nei commenti a questa risposta e nelle risposte rimanenti. Puoi anche trovare un codice completo per impostare l'estensione della mappa usando addOnGlobalLayoutListenerqui .
Chiarimento 2
Un commento osserva che l'utilizzo di questo metodo per un solo marker comporta lo zoom della mappa impostato su un livello di zoom "bizzarro" (che credo sia il massimo livello di zoom disponibile per una determinata posizione). Penso che ciò sia previsto perché:
- L'
LatLngBounds boundsistanza avrà northeastproprietà pari a southwest, il che significa che la porzione di area della terra coperta da questo boundsè esattamente zero. (Questo è logico poiché un singolo marker non ha area.)
- Passando
boundsa CameraUpdateFactory.newLatLngBoundste essenzialmente richiedi un calcolo di tale livello di zoom che bounds(avendo area zero) coprirà l'intera vista della mappa.
- Puoi effettivamente eseguire questo calcolo su un pezzo di carta. Il livello di zoom teorico che è la risposta è + ∞ (infinito positivo). In pratica, l'
Mapoggetto non supporta questo valore, quindi viene bloccato a un livello massimo più ragionevole consentito per una determinata posizione.
Un altro modo per dirlo: come può l' Mapoggetto sapere quale livello di zoom dovrebbe scegliere per una singola posizione ? Forse il valore ottimale dovrebbe essere 20 (se rappresenta un indirizzo specifico). O forse 11 (se rappresenta una città). O forse 6 (se rappresenta un paese). L'API non è così intelligente e la decisione spetta a te.
Quindi, dovresti semplicemente controllare se markersha solo una posizione e, in tal caso, utilizzare uno di:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition()) - vai alla posizione del marker, lascia intatto il livello di zoom corrente.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F) - vai alla posizione del marker, imposta il livello di zoom sul valore scelto arbitrariamente 12.