如何知道用户是不是更改缩放(Google Maps V3)
Posted
技术标签:
【中文标题】如何知道用户是不是更改缩放(Google Maps V3)【英文标题】:How to know if the user change zoom (Google Maps V3)如何知道用户是否更改缩放(Google Maps V3) 【发布时间】:2016-11-21 09:01:08 【问题描述】:我正在使用 Google 地图和 Angularjs 开发一个应用程序。我有这个代码来控制缩放是否改变
google.maps.event.addListener(map, 'zoom_changed', function()
);
问题是,我只需要在用户更改缩放时执行此事件。我的代码中有一个 fitBounds()
也可以更改缩放。
var latlngbounds = new google.maps.LatLngBounds();
for (var i = 0; i < latlng.length; i++)
latlngbounds.extend(latlng[i]);
map.fitBounds(latlngbounds);
是否有区分用户操作的选项?
【问题讨论】:
【参考方案1】:目前公认的解决方案在一般情况下可能无法正确解决此问题。转到 interactive demo 以获取 Google Maps API 文档中的地图 UI 事件。请注意,如果您将光标放在地图上并使用鼠标滚轮滚动,则不会触发任何 mouse
或 drag
事件,因为鼠标保持静止。
当前的解决方案假定在mouseover
事件之后不会发生任何程序化地图更新,这对于原始发布者的应用程序可能是正确的,但在更一般的应用程序中可能不是正确的。
我提出下面的替代解决方案。
首先,无论您在代码中以编程方式更新地图的任何位置,都应在地图上设置一个自定义属性(我们将其称为systemZoomChange
),这表明更改是以编程方式启动的。
var latlngbounds = new google.maps.LatLngBounds();
for (var i = 0; i < latlng.length; i++)
latlngbounds.extend(latlng[i]);
map.systemZoomChange = true
map.fitBounds(latlngbounds);
然后在任何事件侦听器上,添加对自定义 systemZoomChange
属性的检查,并在标记时将其重置,以避免对系统事件进行操作。
map.addListener('zoom_changed', function ()
if (map.systemZoomChange)
map.systemZoomChange = false // Reset the flag for a system-initiated event
else
// Handle the user-initiated event
);
【讨论】:
很好的解决方案,除了你应该设置map.systemZoomChange = true
之前调用fitBounds()
或setZoom()
。
@MrUpsidown - 啊,愚蠢的错误。我编辑了我的答案。谢谢!【参考方案2】:
好的,我找到了方法
google.maps.event.addListenerOnce(map, 'mousemove', function()
google.maps.event.addListener(map, 'zoom_changed', function()
);
);
首先,它检测鼠标是否移动,然后检测缩放是否改变并正常工作!
【讨论】:
这不应该是公认的解决方案,它不是您问题的正确解决方案。此外,它还有意想不到的副作用。以上是关于如何知道用户是不是更改缩放(Google Maps V3)的主要内容,如果未能解决你的问题,请参考以下文章
无论地图视图/缩放如何,如何使用 Google Maps API 一次只能看到 10 个标记
Google Maps SDK iOS - 根据缩放级别计算半径