Vous devez utiliser l' CameraUpdate
classe à faire (probablement) tous programmatiques les mouvements de carte.
Pour ce faire, il faut d'abord calculer les limites de tous les marqueurs de la sorte:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Ensuite, obtenir un mouvement de la description de l'objet à l'aide de l'usine: CameraUpdateFactory
:
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Enfin déplacer la carte:
googleMap.moveCamera(cu);
Ou si vous voulez une animation:
googleMap.animateCamera(cu);
C'est tout :)
Précisions 1
Presque tous les mouvements méthodes nécessitent l' Map
objet à avoir passé le processus d'implantation. Vous pouvez attendre pour que cela se produise à l'aide de l' addOnGlobalLayoutListener
construire. Les détails peuvent être trouvés dans les commentaires de cette réponse et de réponses qui restent. Vous pouvez également trouver un code complet pour le réglage de l'étendue de la carte à l'aide de addOnGlobalLayoutListener
ici.
Clarification 2
Un commentaire note que l'utilisation de cette méthode pour un seul marqueur de résultats dans la carte zoom réglé à une "bizarre" niveau de zoom (qui je crois doit être maximale de niveau de zoom disponibles pour une position donnée). Je pense que c'est normal car:
- L'
LatLngBounds bounds
instance ont northeast
propriété est égale à southwest
, ce qui signifie que la partie de la zone de la terre couverte par le présent bounds
est exactement zéro. (Ce qui est logique, car un seul marqueur n'a pas de zone.)
- En passant
bounds
de CameraUpdateFactory.newLatLngBounds
vous demande un calcul d'un tel niveau de zoom que l' bounds
(ayant zéro de la zone) pour l'ensemble de la vue de la carte.
- Vous pouvez effectuer ce calcul sur un morceau de papier. Le théorique, le niveau de zoom qui est la réponse est +∞ (infinity positive). Dans la pratique, l'
Map
objet ne gère pas cette valeur, elle est ramenée à un niveau plus raisonnable niveau maximum autorisé pour un emplacement donné.
Une autre façon de le dire: comment peut - Map
objet de savoir quel niveau de zoom doit-il choisir pour un seul endroit? Peut-être que la valeur optimale devrait être de 20 (si elle représente une adresse spécifique). Ou peut-être 11 (si elle représente une ville). Ou peut-être 6 (si elle représente un pays). L'API n'est pas que la smart et la décision est à vous.
Donc, vous devriez vérifier simplement si markers
a qu'un seul endroit et dans ce cas, utilisez l'un des:
-
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- aller au marqueur de position, le congé de niveau de zoom actuel intact.
-
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- aller au marqueur, réglez le niveau de zoom à été choisi arbitrairement la valeur 12.