在我的Android项目中,我使用https://github.com/googlemaps/android-maps-utils库将集群应用于地图视图上的一组标记。每当点击一个标记时,我都会通过onClusterItemClick得到通知,这样我就可以执行一些操作。
public interface OnClusterItemClickListener<T extends ClusterItem> {
public boolean onClusterItemClick(T item);
}现在,我想让用户知道哪个标记被点击了。容易的视觉反馈是改变标记图标的颜色。可以通过MarkerOptions对象设置图标,该对象可以在onBeforeClusterItemRendered(T item, MarkerOptions markerOptions)中访问,如下所示:
markerOptions.icon(
BitmapDescriptorFactory.defaultMarker(
BitmapDescriptorFactory.HUE_YELLOW));如果我能够访问Marker对象本身,比如在onMarkerClick (Marker marker)中,我可以通过setIcon更改图标。
如何更改单击的标记图标?
相关
发布于 2015-06-15 11:35:10
我注意到DefaultClusterRenderer提供了检索与ClusterItem关联的Marker对象的方法。由于我使用的是自定义呈现器,所以我能够访问所需的Marker对象,如下所示:
mSelectedMarker = mCustomClusterItemRenderer.getMarker(mSelectedClusterItem);这允许我在onClusterItemClick()中更改图标。
private void updateSelectedMarker() {
if (mSelectedMarker != null) {
mSelectedMarker.setIcon(
BitmapDescriptorFactory.defaultMarker(
BitmapDescriptorFactory.HUE_YELLOW));
}
}发布于 2018-12-18 09:26:18
多亏了@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)
}
}更新
我得到了一个例外:单击标记时的java.lang.IllegalArgumentException: Unmanaged descriptor (在一行lastMarker?.setIcon(unselectedBitmap)中)。
在学习了IllegalArgumentException:使用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
}发布于 2020-07-03 21:38:18
如果一个标记因随机原因而以编程方式未被选中(没有被选中),前面的答案对我不起作用。
我将此代码添加到DefaultClusterRenderer继承者中。
init {
viewModel.selectedItem.observeForever {
if (it == null) {
clusterManager.cluster()
}
}
}不要忘记在渲染器生命周期结束后销毁它。实际上,最好是在渲染器之外使用。我在我的Activity中使用它
private fun onMapClickListener(){
if (viewModel.selectedItem.value != null) clusterManager.cluster()
}以及默认的图标更改代码(我只是在这里切换图标颜色):
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)https://stackoverflow.com/questions/30843425
复制相似问题