24

在我的谷歌地图应用程序中,我有一个跟随移动标记的跟随方法。当它跟随时,我想允许通过所有常用方法(dblclick、dblleftclick、鼠标滚轮和触摸事件)进行缩放,并且我想禁用任何类型的平移。问题是在使用鼠标滚轮和 dblclick 进行缩放时,地图会平移到鼠标的位置。我可以很好地禁用一切,但我想允许缩放。我已经通过使用 jquery 鼠标滚轮插件并使用 delta 更改缩放来解决鼠标滚轮问题。

有没有一些简单的方法可以做到这一点,还是我必须为所有不同的触摸和鼠标事件编写一个监听器?

编辑

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

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

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

我理想的解决方案是,如果有一个disableDoubleClickPananddisableScrollwheelPandraggable选项实际可以防止任何形式的所有拖动

编辑

这适用于所有设备,台式机和移动设备。

4

3 回答 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 设置为相同的值有助于阻止用户的双击事件。

于 2013-12-17T23:26:06.347 回答
3

我最终选择了多种选择。首先,我必须覆盖发生的桌面事件以获得我的结果(触摸、双击、双击左键和鼠标滚轮)。

在触摸屏设备上,当触摸超过两次时,我暂停了对标记的所有更新。这意味着缩放操作时任何捏合事件都不会跳跃。

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

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

function setDraggable(draggable) {
    if ("ontouchend" in document) {
        return;
    }
    var options = {
        draggable: draggable, 
        panControl: draggable, 
        scrollwheel: draggable 
    };
    this.map.setOptions(options);
},

由于以下几个原因,zoom_changed或事件不是真正的选择:idle

  1. idle事件仅在地图空闲时才被调用,并且我正在做的动画量从未被调用过。
  2. 每一步的动画都会在随后的标记上重新定位地图,因此zoom_changed事件将在动画帧之前调用重新定位器。
  3. 由于动画的数量,不平移到中心的想法是减少动画帧并提高性能。
于 2012-07-02T23:36:38.137 回答
2

虽然可能会争辩说双击地图或滚轮缩放地图不需要考虑鼠标位置(因为您正在对地图对象而不是地图上的位置进行操作),但捏到缩放总是位置相关,因为您在物理上围绕某个位置拉伸或挤压地图。改变这种行为显然是不直观的。

在这种情况下,您应该听zoom_changedidle然后平移地图以重新定位它,以便用户可以看到正在发生的事情。

甚至可以使用这些事件来处理默认的双击或鼠标滚轮行为,这样很明显您正在更改用户通常拥有的控制级别。

于 2012-06-13T08:07:09.153 回答