Dovresti usare la CameraUpdate
classe 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' Map
oggetto abbia superato il processo di layout. Puoi aspettare che ciò accada usando il addOnGlobalLayoutListener
costrutto. 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 addOnGlobalLayoutListener
qui .
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 bounds
istanza avrà northeast
proprietà 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
bounds
a CameraUpdateFactory.newLatLngBounds
te 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'
Map
oggetto 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' Map
oggetto 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 markers
ha 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.