How to change marker icon using android map utils?

In my Android project, I use the android-maps-utils library to apply clustering to a bunch of markers on a map. Whenever a marker is clicked, I get a notification through onClusterItemClick , so I can do some action.

 public interface OnClusterItemClickListener<T extends ClusterItem> { public boolean onClusterItemClick(T item); } 

Now I would like to tell the user which marker was clicked . Easy visual feedback will be to change the marker icon (color). The icon can be set via the MarkerOptions object, which can be accessed in onBeforeClusterItemRendered(T item, MarkerOptions markerOptions) , for example here:

 markerOptions.icon( BitmapDescriptorFactory.defaultMarker( BitmapDescriptorFactory.HUE_YELLOW)); 

If I had access to the Marker object itself, for example, in onMarkerClick (Marker marker) , I could change the icon using setIcon .

How can I change the icon of a marked click?


Related

+8
source share
2 answers

I noticed that DefaultClusterRenderer provides methods for getting the Marker object associated with the ClusterItem . Since I use my own renderer anyway, I was able to access the desired Marker object, as shown below:

 mSelectedMarker = mCustomClusterItemRenderer.getMarker(mSelectedClusterItem); 

This allows me to change the icon in onClusterItemClick() :

 private void updateSelectedMarker() { if (mSelectedMarker != null) { mSelectedMarker.setIcon( BitmapDescriptorFactory.defaultMarker( BitmapDescriptorFactory.HUE_YELLOW)); } } 
+12
source

Thanks @JJD, I wrote the same thing on Kotlin.

 private var selectedBitmap: BitmapDescriptor? = null private var unselectedBitmap: BitmapDescriptor? = null private var lastMarker: Marker? = null private var clusterManager: ClusterManager<StationClusterItem>? = null override fun onMapReady(googleMap: GoogleMap) { this.googleMap = googleMap clusterManager = ClusterManager(context!!, googleMap) val clusterRenderer = MarkerClusterRenderer(context!!, googleMap, clusterManager!!, unselectedBitmap!!) clusterManager!!.renderer = clusterRenderer // Add your items to the ClusterManager here with clusterManager?.addItem(). // Better is in background thread. clusterManager!!.cluster() // Add this listener to make ClusterManager correctly zoom clusters and markers. googleMap.setOnCameraIdleListener(clusterManager) // This method is needed to use setOnClusterItemClickListener. googleMap.setOnMarkerClickListener(clusterManager) clusterManager!!.setOnClusterItemClickListener { item -> lastMarker?.setIcon(unselectedBitmap) lastMarker = clusterRenderer.getMarker(item) // Here we access a selected marker. lastMarker?.setIcon(selectedBitmap) false } } class MarkerClusterRenderer( val context: Context, val map: GoogleMap, clusterManager: ClusterManager<StationClusterItem>, private val markerBitmap: BitmapDescriptor ) : DefaultClusterRenderer<StationClusterItem>(context, map, clusterManager) { override fun onBeforeClusterItemRendered(item: StationClusterItem?, markerOptions: MarkerOptions?) { super.onBeforeClusterItemRendered(item, markerOptions) markerOptions?.icon(markerBitmap) } override fun shouldRenderAsCluster(cluster: Cluster<StationClusterItem>?): Boolean { super.shouldRenderAsCluster(cluster) return cluster != null && cluster.size >= 3 } } 

UPDATE

I got an exception: java.lang.IllegalArgumentException: Unmanaged descriptor when clicking on tokens (in the lastMarker?.setIcon(unselectedBitmap) ).

After examining IllegalArgumentException: an unmanaged descriptor using gms.maps.model.Marker.setIcon, I rewrote this listener:

 private var selectedItem: StationClusterItem? = null clusterManager!!.setOnClusterItemClickListener { item -> if (selectedItem != null) { // Set here a reference to a previous marker. // We save a reference to a previous item, not to a marker. val lastMarker = clusterRenderer.getMarker(selectedItem) lastMarker?.setIcon(unselectedBitmap) } selectedItem = item // Now get a reference to a selected marker. val newMarker = clusterRenderer.getMarker(item) newMarker?.setIcon(selectedBitmap) false } 
+1
source

Source: https://habr.com/ru/post/989125/


All Articles