Openlayers 3 当用户与地图交互时,如何执行一些代码?

Openlayers 3 当用户与地图交互时,如何执行一些代码?,openlayers-3,Openlayers 3,我有一张OpenLayers 3.9.0地图。我还有一对LonLat坐标,我正在从外部源跟踪并更新到地图上。我不断地在这些坐标上重新定位地图的中心: 函数在更新坐标()时调用{ map.getView.setCenter(coords); } 我想要的是在用户与地图交互时禁用此自动居中。换句话说,我想要这个: var auto_center = true; function gets_called_when_I_have_updated_coords() { if (auto_cen

我有一张OpenLayers 3.9.0地图。我还有一对LonLat坐标,我正在从外部源跟踪并更新到地图上。我不断地在这些坐标上重新定位地图的中心:

函数在更新坐标()时调用{
map.getView.setCenter(coords);
}
我想要的是在用户与地图交互时禁用此自动居中。换句话说,我想要这个:

var auto_center = true;

function gets_called_when_I_have_updated_coords() {
    if (auto_center) {
        map.getView.setCenter(coords);
    }
}

function user_started_interacting() {
    auto_center = false;
}
// But where should this function be attached to?
// where.on('what?', user_started_interacting);
我不知道如何检测用户交互


我希望它有某种事件,这样当用户开始拖动/旋转/缩放地图时,就会触发一个事件,我的代码就会运行。我找不到此类事件。

作为一种解决方法,我可以将事件附加到视图中的更改:

map.getView().on('change:center', function(ev){…});
但我必须采取额外的步骤来区分代码启动的更改和用户启动的更改。完整的代码如下所示:

var auto_center = true;
var ignore_change_events = false;

function gets_called_when_I_have_updated_coords() {
    if (auto_center) {
        ignore_change_events = true;
        map.getView.setCenter(coords);
        ignore_change_events = false;
    }
}

map.getView().on('change:center', function() {
    if (ignore_change_events) {
        return;
    }
    auto_center = false;
});
请注意,如果使用此方法,则会中断(并且动画完成时没有回调或事件)


根据您的项目,您可能希望尝试此解决方案或。

另一种方法可能是侦听地图上发生的
指针下降
指针下降
事件,并在下降操作时禁用自动居中功能

map.on('pointerdown', function() {
  auto_center = false;
}, this);

map.on('pointerup', function() {
  auto_center = true;
}, this);

这种方法可能需要更多的工作,但这将是一个开始。想法?

在这里,用户正在拖动:

map.on('pointermove', function(evt){
    if(evt.dragging){
        //user interacting
        console.info('dragging');
    }
});
在此,用户正在更改分辨率:

map.getView().on('change:resolution', function(evt){
    console.info(evt);
});
更新

检测键盘交互的一些选项:

//unofficial && undocumented
map.on('key', function(evt){
    console.info(evt);
    console.info(evt.originalEvent.keyIdentifier);
});
//DOM listener
map.getTargetElement().addEventListener('keydown', function(evt){
    console.info(evt);
    console.info(evt.keyIdentifier);
});

.

我找不到for
pointerdown
pointerup
(但可能它存在于某个地方)。我相信,即使用户单击/点击地图,使用此类事件也会触发,而不会实际拖动地图。我也相信它对键盘启动的交互不起作用。最后,它们是否也适用于基于触摸的设备?稍后必须测试此解决方案。此处列出了官方API事件:。你说得对,
pointerdown
pointerup
不那么可靠。你可以使用官方的组合来做你想做的事情。另请参见:我刚刚测试了这个。它适用于基于触摸的设备。它不适用于鼠标滚轮缩放。它不适用于基于键盘的输入。这应该适用于基于鼠标和基于触摸的输入。鼠标滚轮缩放由“change:resolution”捕获,但对于代码启动的
.setZoom()
,该事件也将被触发。这对基于键盘的输入不起作用。您说过“我正在不断地重新调整地图的中心”,因此
setZoom()
超出了范围。对于键盘,应答码仍然需要复制检测按键输入是否将用于与地图交互的逻辑(例如,按Tab键不会)。作为参考,OpenLayers中的相关代码位于和(无需将其添加到答案中)。那么,这是如何结束的呢?答案是。就我的具体情况而言,我相信它比较短,没有动画我也能活下去。但我认识到,在其他情况下,你的解决方案可能更好;将来某一天,我们可能会将代码转换为您的方法。