Vous devez utiliser la CameraUpdate
classe pour effectuer (probablement) tous les mouvements de carte programmatiques.
Pour ce faire, calculez d'abord les limites de tous les marqueurs comme ceci:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Obtenez ensuite un objet de description de mouvement en utilisant l'usine CameraUpdateFactory
::
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Déplacez enfin la carte:
googleMap.moveCamera(cu);
Ou si vous voulez une animation:
googleMap.animateCamera(cu);
C'est tout :)
Clarification 1
Presque toutes les méthodes de mouvement nécessitent que l' Map
objet ait réussi le processus de mise en page. Vous pouvez attendre que cela se produise en utilisant la addOnGlobalLayoutListener
construction. Des détails peuvent être trouvés dans les commentaires de cette réponse et des réponses restantes. Vous pouvez également trouver un code complet pour définir l'étendue de la carte en utilisant addOnGlobalLayoutListener
ici .
Clarification 2
Un commentaire note que l'utilisation de cette méthode pour un seul marqueur entraîne un zoom de la carte réglé sur un niveau de zoom "bizarre" (qui je pense être le niveau de zoom maximum disponible pour un emplacement donné). Je pense que cela est attendu parce que:
- L'
LatLngBounds bounds
instance aura une northeast
propriété égale à southwest
, ce qui signifie que la partie de la surface de la terre couverte par celle-ci bounds
est exactement nulle. (Cela est logique car un seul marqueur n'a pas de zone.)
- En passant
bounds
à CameraUpdateFactory.newLatLngBounds
vous, demandez essentiellement un calcul d'un tel niveau de zoom qui bounds
(ayant une zone nulle) couvrira toute la vue de la carte.
- Vous pouvez réellement effectuer ce calcul sur une feuille de papier. Le niveau de zoom théorique qui est la réponse est + ∞ (infini positif). En pratique, l'
Map
objet ne prend pas en charge cette valeur, il est donc fixé à un niveau maximum plus raisonnable autorisé pour un emplacement donné.
Une autre façon de le dire: comment l' Map
objet peut-il savoir quel niveau de zoom doit-il choisir pour un seul emplacement ? Peut-être que la valeur optimale devrait être 20 (si elle représente une adresse spécifique). Ou peut-être 11 (si cela représente une ville). Ou peut-être 6 (s'il représente un pays). L'API n'est pas si intelligente et la décision vous appartient.
Donc, vous devez simplement vérifier si markers
n'a qu'un seul emplacement et si oui, utilisez l'un des:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- allez à la position du marqueur, laissez le niveau de zoom actuel intact.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- aller à la position du marqueur, régler le niveau de zoom sur la valeur choisie arbitrairement 12.