Vous devez utiliser la CameraUpdateclasse 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' Mapobjet ait réussi le processus de mise en page. Vous pouvez attendre que cela se produise en utilisant la addOnGlobalLayoutListenerconstruction. 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 addOnGlobalLayoutListenerici .
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 boundsinstance aura unenortheastpropriété égale àsouthwest, ce qui signifie que la partie de la surface de la terre couverte par celle-ciboundsest exactement nulle. (Cela est logique car un seul marqueur n'a pas de zone.)
- En passant boundsàCameraUpdateFactory.newLatLngBoundsvous, demandez essentiellement un calcul d'un tel niveau de zoom quibounds(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' Mapobjet 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' Mapobjet 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 markersn'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.