如何知道用户是不是更改缩放(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 事件。请注意,如果您将光标放在地图上并使用鼠标滚轮滚动,则不会触发任何 mousedrag 事件,因为鼠标保持静止。

当前的解决方案假定在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 v2 设置缩放级别

无论地图视图/缩放如何,如何使用 Google Maps API 一次只能看到 10 个标记

Google Maps SDK iOS - 根据缩放级别计算半径

在 Google Maps API v2 中更改标记大小

Android Google Maps v2 - 为 myLocation 设置缩放级别

Google Maps v3 fitBounds 缩放不一致