web-dev-qa-db-fra.com

Comment obtenir les coordonnées d'écran du marqueur dans google maps v2 android

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! :)

30
mangotasche

Oui, utilisez la classe Projection. Plus précisement:

  1. Obtenez Projection de la carte:

    Projection projection = map.getProjection();
    
  2. Obtenez l'emplacement de votre marqueur:

    LatLng markerLocation = marker.getPosition();
    
  3. 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 :)

Éditer

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:

  1. Créez la carte à partir du fichier XML de mise en page en la gonflant
  2. Initialisez la carte.
  3. Ajoutez des marqueurs à la carte.
  4. Recherchez 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.

79
andr