
Gli indicatori identificano le località sulla mappa. L'indicatore predefinito utilizza un'icona standard, comune all'aspetto di Google Maps. È possibile modificare il colore, l'immagine o il punto di ancoraggio dell'icona tramite l'API. I marker sono oggetti di tipo Marker e vengono aggiunti alla mappa con il metodo GoogleMap.addMarker(markerOptions).
Gli indicatori sono progettati per essere interattivi. Per impostazione predefinita, ricevono eventi click e vengono spesso utilizzati con i listener di eventi per visualizzare le finestre informative. Se imposti la proprietà draggable di un indicatore su true, l'utente può modificare la posizione dell'indicatore. Tieni premuto per attivare la possibilità di spostare l'indicatore.
Per impostazione predefinita, quando un utente tocca un indicatore, la barra degli strumenti della mappa viene visualizzata in basso a destra nella mappa, consentendo all'utente di accedere rapidamente all'app mobile Google Maps. Puoi disattivare la barra degli strumenti. Per saperne di più, consulta la guida ai controlli.
Aggiungi un marcatore
L'esempio seguente mostra come aggiungere un indicatore a una mappa. L'indicatore viene creato in corrispondenza delle coordinate -33.852,151.211 (Sydney, Australia) e, se viene selezionato, mostra la stringa "Marker in Sydney" (Indicatore a Sydney) in una finestra informativa.
Kotlin
// Add a marker in Sydney, Australia, // and move the map's camera to the same location. val sydney = LatLng(-33.852, 151.211) map.addMarker( MarkerOptions() .position(sydney) .title("Marker in Sydney"), ) map.moveCamera(CameraUpdateFactory.newLatLng(sydney))
Java
// Add a marker in Sydney, Australia, // and move the map's camera to the same location. LatLng sydney = new LatLng(-33.852, 151.211); map.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); map.moveCamera(CameraUpdateFactory.newLatLng(sydney));
Visualizza informazioni aggiuntive su un indicatore
Un requisito comune è mostrare informazioni aggiuntive su un luogo o una località quando l'utente tocca un indicatore sulla mappa. Consulta la guida alle finestre informative.
Associa i dati a un indicatore
Puoi archiviare un oggetto dati arbitrario con un indicatore utilizzando Marker.setTag()
e recuperarlo utilizzando Marker.getTag(). L'esempio seguente mostra come
puoi conteggiare il numero di volte in cui un indicatore è stato selezionato utilizzando i tag:
Kotlin
val PERTH = LatLng(-31.952854, 115.857342) val SYDNEY = LatLng(-33.87365, 151.20689) val BRISBANE = LatLng(-27.47093, 153.0235) val markerPerth = map.addMarker( MarkerOptions() .position(PERTH) .title("Perth"), ) markerPerth?.tag = 0 val markerSydney = map.addMarker( MarkerOptions() .position(SYDNEY) .title("Sydney"), ) markerSydney?.tag = 0 val markerBrisbane = map.addMarker( MarkerOptions() .position(BRISBANE) .title("Brisbane"), ) markerBrisbane?.tag = 0 // Set a listener for marker click. map.setOnMarkerClickListener { marker -> // Retrieve the data from the marker. val clickCount = marker.tag as? Int // Check if a click count was set, then display the click count. clickCount?.let { val newClickCount = it + 1 marker.tag = newClickCount Toast.makeText( context, "${marker.title} has been clicked $newClickCount times.", Toast.LENGTH_SHORT, ).show() } // Return false to indicate default behavior. false }
Java
final LatLng PERTH = new LatLng(-31.952854, 115.857342); final LatLng SYDNEY = new LatLng(-33.87365, 151.20689); final LatLng BRISBANE = new LatLng(-27.47093, 153.0235); Marker markerPerth = map.addMarker(new MarkerOptions().position(PERTH).title("Perth")); markerPerth.setTag(0); Marker markerSydney = map.addMarker(new MarkerOptions().position(SYDNEY).title("Sydney")); markerSydney.setTag(0); Marker markerBrisbane = map.addMarker(new MarkerOptions().position(BRISBANE).title("Brisbane")); markerBrisbane.setTag(0); // Set a listener for marker click. map.setOnMarkerClickListener( new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(final Marker marker) { // Retrieve the data from the marker. Integer clickCount = (Integer) marker.getTag(); // Check if a click count was set, then display the click count. if (clickCount != null) { clickCount = clickCount + 1; marker.setTag(clickCount); Toast.makeText( context, marker.getTitle() + " has been clicked " + clickCount + " times.", Toast.LENGTH_SHORT) .show(); } // Return false to indicate default behavior should occur. return false; } });
Ecco alcuni esempi di scenari in cui è utile archiviare e recuperare i dati con i marker:
- La tua app potrebbe supportare diversi tipi di indicatori e vuoi trattarli in modo diverso quando l'utente li seleziona. Per farlo, puoi memorizzare un
Stringcon l'indicatore che ne specifica il tipo. - Potresti interfacciarti con un sistema che dispone di identificatori di record univoci, in cui gli indicatori rappresentano record specifici in quel sistema.
- I dati dei segnaposto possono indicare una priorità da utilizzare per decidere l'indice z di un segnaposto.
Rendi trascinabile un indicatore
Puoi riposizionare un indicatore dopo averlo aggiunto alla mappa, a condizione che la sua proprietà draggable sia impostata su true. Tieni premuto l'indicatore per attivare il trascinamento. Quando sollevi il dito dallo schermo, l'indicatore rimarrà in quella posizione.
Per impostazione predefinita, i marker non sono trascinabili. Devi impostare esplicitamente il marker come trascinabile con MarkerOptions.draggable(boolean) prima di aggiungerlo alla mappa o con Marker.setDraggable(boolean) dopo averlo aggiunto alla mappa.
Puoi ascoltare gli eventi di trascinamento sull'indicatore, come descritto in Eventi di trascinamento dell'indicatore.
Lo snippet riportato di seguito aggiunge un indicatore trascinabile a Perth, in Australia.
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .draggable(true), )
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker(new MarkerOptions().position(perthLocation).draggable(true));
Personalizza un indicatore
Questo video mostra i modi per utilizzare gli indicatori per visualizzare le località su una mappa.
Gli indicatori possono definire un'immagine personalizzata da mostrare al posto dell'icona predefinita. La definizione di un'icona comporta l'impostazione di una serie di proprietà che influiscono sul comportamento visivo dell'indicatore.
Gli indicatori supportano la personalizzazione tramite le seguenti proprietà:
- Posizione (obbligatorio)
- Il valore
LatLngper la posizione dell'indicatore sulla mappa. Questa è l'unica proprietà obbligatoria per un oggettoMarker. - Ancoraggio
- Il punto dell'immagine che verrà posizionato nella posizione LatLng dell'indicatore. Per impostazione predefinita, si trova al centro della parte inferiore dell'immagine.
- Alpha
- Imposta l'opacità dell'indicatore. Il valore predefinito è 1.0.
- Titolo
- Una stringa visualizzata nella finestra informativa quando l'utente tocca l'indicatore.
- Snippet
- Testo aggiuntivo visualizzato sotto il titolo.
- Icona
- Una bitmap visualizzata al posto dell'immagine predefinita dell'indicatore.
- Trascinabile
- Imposta su
truese vuoi consentire all'utente di spostare l'indicatore. Il valore predefinito èfalse. - Visibile
- Imposta su
falseper rendere invisibile l'indicatore. Il valore predefinito ètrue. - Orientamento piatto o cartellone
- Per impostazione predefinita, i marker utilizzano un orientamento di tipo billboard, ovvero vengono disegnati orientati rispetto allo schermo del dispositivo anziché rispetto alla superficie della mappa. La rotazione, l'inclinazione o lo zoom della mappa non modificano l'orientamento dell'indicatore. Puoi impostare l'orientamento di un indicatore in modo che sia piatto rispetto alla Terra. I marker piatti ruotano quando la mappa viene ruotata e cambiano prospettiva quando la mappa viene inclinata. Come per gli indicatori di tipo cartellone, gli indicatori piatti mantengono le loro dimensioni quando lo zoom della mappa viene aumentato o diminuito.
- Rotazione
- L'orientamento dell'indicatore, specificato in gradi in senso orario. La posizione predefinita cambia se l'indicatore è piatto. La posizione predefinita di un indicatore piatto è allineata a nord. Quando l'indicatore non è piatto, la posizione predefinita è rivolta verso l'alto e la rotazione è tale che l'indicatore è sempre rivolto verso la fotocamera.
Lo snippet seguente crea un indicatore semplice con l'icona predefinita.
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation), )
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker(new MarkerOptions().position(melbourneLocation));
Personalizza il colore dell'indicatore
È possibile personalizzare il colore dell'immagine dell'indicatore predefinito passando un oggetto BitmapDescriptor al metodo icon(). Puoi utilizzare un insieme di colori predefiniti nell'oggetto BitmapDescriptorFactory o impostare un colore personalizzato per l'indicatore con il metodo BitmapDescriptorFactory.defaultMarker(float hue). La tonalità è un valore compreso tra 0 e 360, che rappresenta i punti su una ruota dei colori.
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)), )
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation) .icon( BitmapDescriptorFactory.defaultMarker( BitmapDescriptorFactory.HUE_AZURE)));
Personalizza l'opacità dell'indicatore
Puoi controllare l'opacità di un indicatore con il metodo MarkerOptions.alpha(). Il valore alfa deve essere specificato come un numero in virgola mobile compreso tra 0,0 e 1,0, dove 0 è completamente trasparente e 1 è completamente opaco.
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .alpha(0.7f), )
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker(new MarkerOptions().position(melbourneLocation).alpha(0.7f));
Personalizza l'immagine dell'indicatore
Puoi sostituire l'immagine dell'indicatore predefinita con un'immagine dell'indicatore personalizzata, spesso chiamata icona. Le icone personalizzate vengono sempre impostate come BitmapDescriptor e definite utilizzando uno dei metodi della classe BitmapDescriptorFactory.
fromAsset(String assetName)- Crea un indicatore personalizzato utilizzando il nome di un'immagine bitmap nella directory degli asset.
fromBitmap(Bitmap image)- Crea un indicatore personalizzato da un'immagine bitmap.
fromFile(String fileName)- Crea un'icona personalizzata utilizzando il nome di un file immagine bitmap che si trova nello spazio di archiviazione interno.
fromPath(String absolutePath)- Crea un indicatore personalizzato da un percorso file assoluto di un'immagine bitmap.
fromResource(int resourceId)- Crea un indicatore personalizzato utilizzando l'ID risorsa di un'immagine bitmap.
Lo snippet di seguito crea un indicatore con un'icona personalizzata.
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)), )
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));
Appiattisci un indicatore
Le icone degli indicatori vengono normalmente disegnate rispetto allo schermo; la rotazione, l'inclinazione o lo zoom della mappa non modificano l'orientamento dell'indicatore. Puoi impostare l'orientamento di un indicatore in modo che sia piatto rispetto alla Terra. Gli indicatori orientati in questo modo ruotano quando la mappa viene ruotata e cambiano prospettiva quando la mappa viene inclinata. Gli indicatori piatti mantengono le loro dimensioni quando la mappa viene ingrandita o rimpicciolita.
Per modificare l'orientamento dell'indicatore, imposta la proprietà flat dell'indicatore su true.
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .flat(true), )
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker(new MarkerOptions().position(perthLocation).flat(true));
Ruota un indicatore
Puoi ruotare un indicatore attorno al suo punto di ancoraggio con
Marker.setRotation(). La rotazione viene misurata in gradi in senso orario
dalla posizione predefinita. Quando l'indicatore è piatto sulla mappa, la posizione predefinita è Nord. Quando l'indicatore non è piatto, la posizione predefinita è rivolta verso l'alto e la rotazione è tale che l'indicatore è sempre rivolto verso la fotocamera.
L'esempio seguente ruota l'indicatore di 90°. L'impostazione del punto di ancoraggio su 0.5,0.5 fa sì che l'indicatore venga ruotato attorno al suo centro, anziché alla sua base.
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .anchor(0.5f, 0.5f) .rotation(90.0f), )
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .anchor(0.5f, 0.5f) .rotation(90.0f));
Z-index dell'indicatore
L'indice z specifica l'ordine di impilamento di questo indicatore rispetto ad altri indicatori sulla mappa. Un indicatore con un indice z elevato viene disegnato sopra gli indicatori con indici z inferiori. Il valore predefinito di z-index è 0.
Imposta l'indice z sull'oggetto opzioni dell'indicatore chiamando MarkerOptions.zIndex(), come mostrato nel seguente snippet di codice:
Kotlin
map.addMarker( MarkerOptions() .position(LatLng(10.0, 10.0)) .title("Marker z1") .zIndex(1.0f), )
Java
map.addMarker( new MarkerOptions().position(new LatLng(10, 10)).title("Marker z1").zIndex(1.0f));
Puoi accedere allo z-index dell'indicatore chiamando Marker.getZIndex() e puoi modificarlo chiamando Marker.setZIndex().
I marker vengono sempre disegnati sopra i livelli di riquadri e altri overlay non marker (overlay del terreno, polilinee, poligoni e altre forme), indipendentemente dall'indice z degli altri overlay. I segnaposto vengono effettivamente considerati in un gruppo di indici z separato rispetto ad altri overlay.
Leggi di seguito informazioni sull'effetto di z-index sugli eventi di clic.
Gestisci gli eventi degli indicatori
L'API di Google Maps ti consente di ascoltare e rispondere agli eventi degli indicatori. Per ascoltare questi eventi, devi impostare il listener corrispondente sull'oggetto GoogleMap a cui appartengono gli indicatori. Quando l'evento si verifica su uno degli indicatori sulla mappa, viene richiamato il callback del listener con l'oggetto Marker corrispondente passato come parametro. Per confrontare questo oggetto Marker con il tuo riferimento a un oggetto Marker, devi utilizzare equals() e non ==.
Puoi ascoltare i seguenti eventi:
- Eventi di clic sui segnaposto
- Eventi di trascinamento degli indicatori
- Eventi di clic sulla finestra informativa
Eventi di clic sugli indicatori
Puoi utilizzare un OnMarkerClickListener per ascoltare
gli eventi di clic sull'indicatore. Per impostare questo listener sulla mappa, chiama
GoogleMap.setOnMarkerClickListener(OnMarkerClickListener). Quando un utente fa clic su un indicatore, verrà chiamato onMarkerClick(Marker) e l'indicatore verrà passato come argomento. Questo metodo restituisce un valore booleano che indica se hai utilizzato l'evento (ovvero se vuoi sopprimere il comportamento predefinito). Se restituisce false, oltre al comportamento personalizzato verrà eseguito il comportamento predefinito. Il comportamento predefinito per un evento di clic su un indicatore è mostrare la relativa finestra informativa (se disponibile) e spostare la fotocamera in modo che l'indicatore sia centrato sulla mappa.
Effetto di z-index sugli eventi di clic:
- Quando un utente fa clic su un gruppo di indicatori, l'evento di clic viene attivato per l'indicatore con lo z-index più alto.
- Per ogni clic viene attivato al massimo un evento. In altre parole, il clic non viene trasmesso agli indicatori o ad altri overlay con valori di z-index inferiori.
- Se fai clic su un gruppo di indicatori, i clic successivi scorrono il gruppo, selezionando ogni indicatore a turno. L'ordine del ciclo dà la priorità prima allo z-index, poi alla vicinanza al punto di clic.
- Se l'utente fa clic al di fuori della prossimità del cluster, l'API ricalcola il cluster e reimposta lo stato del ciclo di clic in modo che inizi dall'inizio.
- I marker sono considerati in un gruppo di indice z separato rispetto ad altri overlay o forme (polilinee, poligoni, cerchi e/o overlay del terreno), indipendentemente dall'indice z degli altri overlay. Se più indicatori, overlay o forme sono sovrapposti, l'evento di clic viene applicato prima al cluster di indicatori.
Eventi di trascinamento dei marker
Puoi utilizzare un OnMarkerDragListener per ascoltare gli eventi di trascinamento su un indicatore. Per impostare questo listener sulla mappa, chiama
GoogleMap.setOnMarkerDragListener. Per trascinare un indicatore, l'utente deve tenerlo premuto. Quando l'utente solleva il dito dallo schermo, l'indicatore rimane in quella posizione. Quando un indicatore viene trascinato, viene chiamato inizialmente onMarkerDragStart(Marker). Durante il trascinamento dell'indicatore, onMarkerDrag(Marker) viene chiamato costantemente. Al termine del trascinamento, viene chiamato onMarkerDragEnd(Marker). Puoi ottenere la posizione dell'indicatore in qualsiasi momento chiamando Marker.getPosition().