在下面的地图中,我有三个标记,红色的是用户当前的位置,绿色的是可点击的标记。
点击底部没有问题。但是点击用户接近的位置是另一回事,因为位置标记在路上。因此,对于这种情况,用户通常需要点击2-8次才能触摸到绿色的。

是否有一种方法可以定义某些标记是不可点击的,这样它们就不会触发onMarkerClickListener?
我知道我可以更改z索引,并将位置标记放在下面,但是如果用户在接近另一个标记时看不到自己的位置,这对他是不好的。
另一个解决方案可以想到但不喜欢的是拦截点击的用户标记,然后通过一个列表的其他标记,并找到可能的匹配,并触发自己点击。我更喜欢现有的解决方案。
发布于 2018-04-16 12:40:14
因此,我最后所做的是将标记所代表的对象添加到它的标记中。然后,在onMarkerClickListener中,我通过标记对象检查标记类型。就像(科特林):
map.setOnMarkerClickListener { marker ->
val mapEvent: MapEvent?
mapEvent =
if (marker.tag is MapEvent) {
marker.tag as MapEvent?
} else {
val clickedMarker = getClickedMarker(from = map)
if (clickedMarker != null)
clickedMarker.tag as MapEvent?
else
return@setOnMarkerClickListener false
}
markerClicked(this@MainActivity, mapEvent)
true
}如果对象的类型为MapEvent,则调用markerClicked(),如果单击的标记不是MapEvent类型,则遍历所有标记的列表,以查看单击标记是否位于任何MapEvent标记的半径内。如果是这样的话,我使用这个标记并调用markerClicked()。
我就是这样整理标记列表的:
fun getClickedMarker(from: GoogleMap): Marker? {
if (!::userMarker.isInitialized)
return null
var clickWidth = ContextCompat.getDrawable(App.context, R.drawable.ic_map_permanent)!!.intrinsicWidth
clickWidth += (clickWidth / 3)
val g0 = from.projection.fromScreenLocation(Point(0, 0))
val g1 = from.projection.fromScreenLocation(Point(clickWidth, clickWidth))
val latRadius = (g1.latitude - g0.latitude) / 2
val lonRadius = (g1.longitude - g0.longitude) / 2
return try {
eventMarkers.single {
it.position!!.latitude - latRadius > userMarker.position.latitude && // west
it.position!!.latitude + latRadius < userMarker.position.latitude && // east
it.position!!.longitude + lonRadius > userMarker.position.longitude && // north
it.position!!.longitude - lonRadius < userMarker.position.longitude // south
}
} catch (e: Exception) {
null
}
}如果有什么不清楚的地方,请评论。我希望这能帮到其他人!
https://stackoverflow.com/questions/49814625
复制相似问题