首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用GoogleMaps onMarkerClickListener时,是否可以忽略某些标记,从而甚至不会触发单击侦听器?

在使用GoogleMaps onMarkerClickListener时,是否可以忽略某些标记,从而甚至不会触发单击侦听器?
EN

Stack Overflow用户
提问于 2018-04-13 10:14:51
回答 1查看 44关注 0票数 1

在下面的地图中,我有三个标记,红色的是用户当前的位置,绿色的是可点击的标记。

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

是否有一种方法可以定义某些标记是不可点击的,这样它们就不会触发onMarkerClickListener?

我知道我可以更改z索引,并将位置标记放在下面,但是如果用户在接近另一个标记时看不到自己的位置,这对他是不好的。

另一个解决方案可以想到但不喜欢的是拦截点击的用户标记,然后通过一个列表的其他标记,并找到可能的匹配,并触发自己点击。我更喜欢现有的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-16 12:40:14

因此,我最后所做的是将标记所代表的对象添加到它的标记中。然后,在onMarkerClickListener中,我通过标记对象检查标记类型。就像(科特林):

代码语言:javascript
复制
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()。

我就是这样整理标记列表的:

代码语言:javascript
复制
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
    }
}

如果有什么不清楚的地方,请评论。我希望这能帮到其他人!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49814625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档