1

我正在用 Titanium(v5.0.4,sdk 5.1.2GA)编写一个跨平台的移动应用程序。该应用程序显示带有标记的地图,用于标记靠近当前位置的兴趣点。如果用户将地图移动到新区域,则所有先前显示的标记都将被移除,并根据新位置计算并显示一组新标记。用户可以单击一个标记,并显示一个信息窗口。单击 infoWindow 会打开一个新窗口以获取更多信息。

这在 IOS(使用 MapKit)上运行良好。但是,在 Android(使用 Google 地图)上,单击标记会显示 infoWindow,但也会使地图以标记为中心,这会触发“regionchanged”事件,这会导致我的应用删除标记并显示新集。基本上,用户永远无法单击 infoWindow,也无法到达新窗口以获取更多信息。

我想要做的:防止谷歌地图在点击它时自动平移到一个标记。

或者,有没有办法区分单击标记后触发的“regionchanged”事件和用户移动地图触发的“regionchanged”事件?这将允许我只对后者作出反应。

我发现了这一点(单击它时无法防止自动平移到标记(谷歌地图))但这是轨道上的红宝石。我遇到的其他事情(虽然找不到链接)涉及重载“点击”事件处理程序或使用 disableAutoPan infoWindow 选项(谷歌地图:如何防止 InfoWindow 移动地图),但这都是为了Javascript API。

那么,有人知道吗?

4

1 回答 1

0

我最近遇到了同样的问题。虽然你问这个问题已经很长时间了,但我认为解决方案在这里值得注意。

  1. 使地图视图同时响应clickregionchanged事件

<View id="mapView" module="ti.map" onClick="click" onRegionchanged="regionChanged" method="createView"> </View>

  1. 使用两个事件侦听器都可以访问的标志变量。

var clicked = 0;

  1. click事件设置变量。

var click = function(e) { clicked = 1; ... }

  1. 用 .包装regionchanged事件的功能_.defer(...)

var regionChanged = function(e) { _.defer(function(){ ... (regionchanged code goes here) }); }

  1. regionchanged如果设置了变量,则不应执行代码。

var regionChanged = function(e) { _.defer(function(){ if (clicked == 0) { ... (regionchanged code goes here) } }); }

  1. regionchanged在代码末尾取消设置变量。

var regionChanged = function(e) { _.defer(function(){ if (clicked == 0) { ... (regionchanged code goes here) } clicked = 0; }); }

这里defer以某种方式确保两个事件都被触发(似乎)regionchanged事件发生在点击事件之后。我认为情况可能并非总是如此,但我的测试并没有让我失望。

而且我知道我可以将布尔值用于clicked:)

于 2016-12-22T18:41:42.653 回答