谷歌地图:禁用用户在所有事件上拖动

24
在我的谷歌地图应用程序中,我有一个跟随方法,可以跟随移动标记。当它正在跟随时,我希望允许通过所有常规方法进行缩放(双击、双左击、鼠标滚轮和触摸事件),并且禁用任何形式的平移。问题是,在使用鼠标滚轮和双击缩放时,地图会平移到鼠标的位置。我可以很好地禁用所有内容,但我想允许缩放。我已经使用jquery鼠标滚轮插件解决了鼠标滚轮问题,并使用delta改变缩放比例。

有没有什么简单的方法来做到这一点,或者我必须为所有不同的触摸和鼠标事件编写监听器?

编辑:

我已经禁用了双击、鼠标滚轮缩放和拖动,但我希望仍然保留双击功能。我也想要触摸事件,但我希望它们从中心缩放而不是从事件发生的位置缩放。真正的问题是复制谷歌已经处理的事件,但将功能稍微更改。

var options = {
    disableDoubleClickZoom: true,
    draggable: false,
    scrollwheel: false,
    panControl: false
};

this.map = new google.maps.Map(document.getElementById('map'), options);

我的理想解决方案是如果有disableDoubleClickPandisableScrollwheelPan或者draggable选项实际上可以防止任何类型的拖动。

编辑

这适用于所有设备,包括桌面和移动设备。


1
为什么不使用地图的 disableDoubleClickZoom 选项禁用“正常”缩放,然后为地图设置一个 dblclick 事件监听器,以使用现有地图中心(通过使用 center 属性捕获)进行缩放。这应该会禁用平移。 - andresf
那并没有解决我的问题,它只是让我重新编写事件而已。我的真正问题是触摸事件,比如双指缩放。 - georgephillips
1
你可能想在你的帖子中反映出你正在为移动设备构建。 - andresf
有效的观点,我已经改变了它。 - georgephillips
我会采纳Andrew的建议,监听zoom_changed事件并在事件处理程序中将地图重新定位到标记的位置,代码如下:google.maps.event.addListener(map,'zoom_changed', function() { map.panTo(marker.getPosition()); }); - Marcelo
3个回答

19

这是我做的方式:

var options = {
    draggable: false,
    scrollwheel: false,
    panControl: false,
    maxZoom: Zoom,
    minZoom: Zoom,
    zoom: Zoom,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
};

正如您所看到的,将maxZoom和minZoom设置为相同的值有助于阻止用户的双击事件。


3

我最终选择了多种方案。首先,我必须覆盖桌面事件以达到我的目标(触摸、双击、双左击和鼠标滚轮)。

在触摸屏设备上,当有两个以上的触点时,我暂停所有标记的更新,这意味着任何缩放操作时,捏合事件不会跳来跳去。

在普通的Web桌面设备上,我禁用地图上的缩放和双击事件,并重新编写了我的事件处理程序。

为了区分它们,我检查了窗口对象中的ontouchstart事件。

function setDraggable(draggable) {
    if ("ontouchend" in document) {
        return;
    }
    var options = {
        draggable: draggable, 
        panControl: draggable, 
        scrollwheel: draggable 
    };
    this.map.setOptions(options);
},
zoom_changedidle 事件并不是一个好的选择,原因如下:
  1. idle 事件仅在地图闲置时调用,而由于我正在进行大量动画处理,这个事件从来没有被调用。
  2. 每一步动画都会重新将地图居中到跟随的标记上,所以 zoom_changed 事件会在动画帧之前再次调用重新定位。
  3. 由于动画量很大,不居中的想法是为了减少动画帧数和提高性能。

2
虽然可以争辩双击地图或滚动鼠标滚轮缩放地图不需要考虑鼠标位置(因为您是在处理地图对象而不是地图上的位置),但捏合缩放始终与位置有关,因为您会在某个位置周围物理拉伸或压缩地图。更改该行为将明显不直观。
在这种情况下,您应该监听“zoom_changed”或“idle”,然后平移地图以重新对其进行居中,以便用户可以看到正在发生的事情。
您甚至可以使用这些事件来处理默认的双击或鼠标滚轮行为,以使用户明确您正在改变用户通常具有的控制级别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接