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.
addOnGlobalLayoutListener()
oupost()
avec une solution appropriéeRunnable
. C'est exactement la raison pour laquelle obtenir les coordonnées de l'écran du marqueur ne peut pas être fait dansonCreate
- voir stackoverflow.com/q/14429877/1820695 Cependant, vous pouvez utiliser certaines méthodes avant même que la mise en page se soit produite - par exemple.CameraUpdateFactory.newLatLngBounds()
avec 4 paramètres .Google Map V2
La solution suivante fonctionne pour Android Marshmallow 6 (API 23, API 24, API 25, API 26, API 27, API 28). Il fonctionne également dans Xamarin.
la source
Alors
par exemple, votre carte Google se trouve dans RelativeLayout:
la source
Je ne pouvais pas utiliser le onGlobalLayoutlistener, voici donc une autre solution pour éviter l'
"Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions."
erreur:la source
À partir de ce code, j'affiche plusieurs marqueurs avec un zoom particulier sur l'écran de la carte.
// Variables déclarées
// Méthode pour ajouter plusieurs points de marqueur avec une icône dessinable
// Pour ajouter plusieurs marqueurs visibles sur la carte
la source
Remarque - Ce n'est pas une solution à la question d'origine. Ceci est une solution à l'un des sous-problèmes discutés ci - dessus .
Solution à @andr Clarification 2 -
C'est vraiment problématique quand il n'y a qu'un seul marqueur dans les limites et à cause de cela le niveau de zoom est réglé à un niveau très élevé ( niveau 21 ). Et Google ne fournit aucun moyen de définir le niveau de zoom maximal à ce stade. Cela peut également se produire lorsqu'il y a plus d'un marqueur mais qu'ils sont tous assez proches les uns des autres. Ensuite, le même problème se produira également.
Solution - Supposons que vous souhaitiez que votre carte ne dépasse jamais le niveau de zoom 16. Puis après avoir fait -
Vérifiez si votre niveau de zoom a franchi le niveau 16 (ou ce que vous voulez) -
Et si ce niveau est supérieur à 16, ce qui ne sera le cas que s'il y a très moins de marqueurs ou si tous les marqueurs sont très proches les uns des autres, il vous suffit de faire un zoom arrière sur votre carte à cette position particulière uniquement en réglant le niveau de zoom sur 16.
De cette façon, vous n'aurez jamais le problème du niveau de zoom "bizarre" très bien expliqué par @andr.
la source
cela aiderait .. à partir de démos google apis
pour des informations claires, regardez cette URL. https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java
la source
J'ai eu un problème similaire, l'utilisation du code suivant a résolu le problème:
CameraUpdateFactory.newLatLngBounds(bounds, 200, 200, 5)
généralement, les différences de localisation dans mon cas ne sont pas plus de deux villes voisines.zoom pour s'adapter à tous les marqueurs sur la carte google maps v2
la source
Afficher tous les marqueurs avec Google map
Dans ces méthodes, stockez tous les marqueurs et zoomez automatiquement pour afficher tous les marqueurs dans google map.
la source
Utilisez la méthode "getCenterCoordinate" pour obtenir les coordonnées centrales et les utiliser dans CameraPosition.
la source
J'ai une autre façon de faire cette même chose fonctionne parfaitement. donc l'idée derrière pour afficher tous les marqueurs sur l'écran, nous avons besoin d'un centre de lat long et d'un niveau de zoom. voici la fonction qui vous donnera les deux et aura besoin de tous les objets Latlng du marqueur en entrée.
Cette fonction renvoie un objet Pair que vous pouvez utiliser comme
vous pouvez au lieu d'utiliser un rembourrage pour éloigner vos marqueurs des limites de l'écran, vous pouvez régler le zoom de -1.
la source
http://i64.tinypic.com/2qjybh4.png
http://i63.tinypic.com/flzwus.png
http://i63.tinypic.com/112g5fm.png
la source