J'ai un petit Android (api google maps v2))
Voici mon code:
GoogleMaps mMap;
Marker marker = mMap.addMarker(new MarkerOptions().position(new LatLng(20, 20)));
J'essaie de trouver un moyen d'obtenir les coordonnées d'écran actuelles (x, y) pour cet objet marqueur.
Peut-être que quelqu'un a une idée? J'ai essayé getProjection mais cela ne fonctionne pas. Merci! :)
Oui, utilisez la classe Projection
. Plus précisement:
Obtenez Projection
de la carte:
Projection projection = map.getProjection();
Obtenez l'emplacement de votre marqueur:
LatLng markerLocation = marker.getPosition();
Passez l'emplacement à la méthode Projection.toScreenLocation()
:
Point screenPosition = projection.toScreenLocation(markerLocation);
C'est tout. Maintenant, screenPosition
contiendra la position du marqueur par rapport au coin supérieur gauche de tout le conteneur Map :)
N'oubliez pas que l'objet Projection
ne renverra que des valeurs valides après que la carte a passé le processus de mise en page (c'est-à-dire qu'il a un ensemble width
et height
valide défini) ). Vous obtenez probablement (0, 0)
Parce que vous essayez d'accéder à la position des marqueurs trop tôt, comme dans ce scénario:
Projection
de la carte pour les positions des marqueurs à l'écran.Ce n'est pas une bonne idée car la carte n'a pas de largeur et de hauteur valides. Vous devez attendre que ces valeurs soient valides. L'une des solutions consiste à attacher un OnGlobalLayoutListener
à la vue de carte et à attendre que le processus de mise en page se déroule. Faites-le après avoir gonflé la mise en page et initialisé la carte - par exemple dans onCreate()
:
// map is the GoogleMap object
// marker is Marker object
// ! here, map.getProjection().toScreenLocation(marker.getPosition()) will return (0, 0)
// R.id.map is the ID of the MapFragment in the layout XML file
View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
if (mapView.getViewTreeObserver().isAlive()) {
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// remove the listener
// ! before Jelly bean:
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
// ! for Jelly bean and later:
//mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// set map viewport
// CENTER is LatLng object with the center of the map
map.moveCamera(CameraUpdateFactory.newLatLngZoom(CENTER, 15));
// ! you can query Projection object here
Point markerScreenPosition = map.getProjection().toScreenLocation(marker.getPosition());
// ! example output in my test code: (356, 483)
System.out.println(markerScreenPosition);
}
});
}
Veuillez lire les commentaires pour plus d'informations.