[英]How to change the clicked marker icon using android-maps-utils?
In my Android project I am using the android-maps-utils library to apply clustering to a bunch of markers on a map view.在我的 Android 项目中,我使用android-maps-utils库将聚类应用于地图视图上的一堆标记。 Whenever a marker is clicked I get notified via
onClusterItemClick
so I can do some action.每当单击标记时,我都会通过
onClusterItemClick
收到通知,以便我可以执行某些操作。
public interface OnClusterItemClickListener<T extends ClusterItem> {
public boolean onClusterItemClick(T item);
}
Now I would like to let the user know which marker has been clicked .现在我想让用户知道点击了哪个标记。 The easies visual feedback would be to change the (color of the) marker icon.
简单的视觉反馈是更改标记图标的(颜色)。 A icon can be set via the
MarkerOptions
object which can be access within onBeforeClusterItemRendered(T item, MarkerOptions markerOptions)
such as here:可以通过
MarkerOptions
对象设置图标,该对象可以在onBeforeClusterItemRendered(T item, MarkerOptions markerOptions)
访问onBeforeClusterItemRendered(T item, MarkerOptions markerOptions)
例如:
markerOptions.icon(
BitmapDescriptorFactory.defaultMarker(
BitmapDescriptorFactory.HUE_YELLOW));
If I would have access to the Marker
object itself such as in onMarkerClick (Marker marker)
I could change the icon via setIcon
.如果我可以访问
Marker
对象本身,例如在onMarkerClick (Marker marker)
我可以通过setIcon
更改图标。
How can I change the clicked marker icon?如何更改单击的标记图标?
I noticed that the DefaultClusterRenderer
provides methods to retrieve the Marker
object associated with a ClusterItem
.我注意到
DefaultClusterRenderer
提供了检索与ClusterItem
关联的Marker
对象的方法。 Since I use a custom renderer anyways I was able to access the desired Marker
object as shown here:由于我无论如何都使用自定义渲染器,因此我能够访问所需的
Marker
对象,如下所示:
mSelectedMarker = mCustomClusterItemRenderer.getMarker(mSelectedClusterItem);
This allows me to change the icon within onClusterItemClick()
:这允许我更改
onClusterItemClick()
的图标:
private void updateSelectedMarker() {
if (mSelectedMarker != null) {
mSelectedMarker.setIcon(
BitmapDescriptorFactory.defaultMarker(
BitmapDescriptorFactory.HUE_YELLOW));
}
}
Thanks to @JJD, I wrote the same in Kotlin.感谢@JJD,我用 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.
val boundsBuilder = LatLngBounds.Builder()
...
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 - to show info window. See GoogleMap.InfoWindowAdapter.
// true - to hide info window.
false
}
}
class MarkerClusterRenderer(
val context: Context,
val map: GoogleMap,
clusterManager: ClusterManager<StationClusterItem>,
private val markerBitmap: BitmapDescriptor
) : DefaultClusterRenderer<StationClusterItem>(context, map, clusterManager) {
init {
minClusterSize = 1 // 2, 3 or more, as you wish.
}
override fun onBeforeClusterItemRendered(item: StationClusterItem?,
markerOptions: MarkerOptions?) {
super.onBeforeClusterItemRendered(item, markerOptions)
markerOptions?.icon(markerBitmap)
}
}
UPDATE更新
I got an exception: java.lang.IllegalArgumentException: Unmanaged descriptor
when clicked markers (in a line lastMarker?.setIcon(unselectedBitmap)
).我得到了一个异常:
java.lang.IllegalArgumentException: Unmanaged descriptor
当点击标记时(在一行lastMarker?.setIcon(unselectedBitmap)
)。
After studying IllegalArgumentException: Unmanaged descriptor using gms.maps.model.Marker.setIcon I rewrote that listener:在研究了IllegalArgumentException: Unmanaged descriptor using gms.maps.model.Marker.setIcon 之后,我重写了那个监听器:
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
}
The previous answer doesn't work correctly for me if a marker became unselected programmatically for a random reason (none is selected).如果某个标记由于随机原因以编程方式未选中(未选中),则上一个答案对我来说不起作用。
I added this code to the DefaultClusterRenderer
inheritor我将此代码添加到
DefaultClusterRenderer
继承者
init {
viewModel.selectedItem.observeForever {
if (it == null) {
clusterManager.cluster()
}
}
}
Don't forget to destroy it after this renderer lifecycle ends.在此渲染器生命周期结束后,不要忘记销毁它。 And actually, it's better to use outside of the renderer.
实际上,最好在渲染器之外使用。 I use it in my
Activity
我在我的
Activity
使用它
private fun onMapClickListener(){
if (viewModel.selectedItem.value != null) clusterManager.cluster()
}
And the default icon changing code (I'm simply switching icon color here):和默认图标更改代码(我只是在这里切换图标颜色):
override fun onBeforeClusterItemRendered(item: ClusterMarker, markerOptions: MarkerOptions) {
markerOptions.icon(getMarkerColor(item))
}
override fun onClusterItemUpdated(item: ClusterMarker, marker: Marker) {
marker.setIcon(getMarkerColor(item))
}
private fun getMarkerColor(item: ClusterMarker): BitmapDescriptor {
val color = if (item.id == viewModel.selectedItem.value?.id) BitmapDescriptorFactory.HUE_ORANGE
else item.getColor()
return BitmapDescriptorFactory.defaultMarker(color)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.