有没有办法在Google Maps V3上禁用拖动惯性?看起来应该是一个MapOption,但我找不到任何方法来实现这一点。
var map = /* All the map config */
var stickyCenter = map.getCenter();
/* ... Code ... */
google.maps.event.addListener(map, 'drag', function(){ stickyCenter = map.getCenter(); });
google.maps.event.addListener(map, 'idle', function() { map.setCenter(stickyCenter); });
发生的情况是当你拖动地图并且地图停止后(惯性消失后),地图会“捕捉”回原位。
如果捕捉过于突然,可以使用panTo或以某种方式动画化移动。希望这可以帮到你,虽然不完美,但这是将拖动事件的动量反转的一种方法。
center_changed
事件,该事件将考虑dragend
和idle
事件之间的时间。https://developers.google.com/maps/documentation/javascript/events - Devin Mdragend
事件后添加 idle
监听器来解决该用例。当地图停止移动时,空闲事件将触发。为定位叠加层,请使用 bounds_changed
或 center_changed
而不是 drag
。 - EdgeCaseBerg使用未记录的选项 disablePanMomentum
例如:
new google.maps.Map(document.getElementById(id), {
disablePanMomentum: true,
backgroundColor: 'none',
disableDefaultUI: true,
center: {
lat: 40.674,
lng: -73.945
},
zoom: 2,
...
我相信至少可以抵消这种动量。如果我错了,请有人纠正我!为了简单起见,例如,假设您的地图容器具有100vw
的width
和100vh
的height
。您只需在由mouseup
事件调用的函数中调用getCenter()
,然后使用这些坐标立即调用setCenter()
?
function initMap(){
...
var win = window;
google.maps.event.addDomListener(win, 'mouseup', setCoords);
function setCoords(){
var x = myMap.getCenter();
var lat = x.lat();
var lng = x.lng();
myMap.addListener('center_changed', function(lat, lng){
myMap.setCenter(new google.maps.LatLng(lat, lng));
};
};
myMap.addListener...
但实际上并不是这样。它的功能就像代码根本不存在一样。请查看我的其他线程。http://stackoverflow.com/questions/39626454/functions-uncaught-rangeerror-maximum-call-stack-size-exceeded-with-google-m - user2230470这个对我来说完全没问题:
map.addListener("dragend", () => map.setCenter(map.getCenter()));
在有动力的情况下,idle按预期工作,当地图在平移或缩放后变为静止时触发。
let dragFinished = false;
map.addListener("dragend", () => {
dragFinished = true;
});
map.addListener("idle", () => {
// idle could be fired after zooming also, but we need to catch it only after drag
if (dragFinished) {
dragFinished = false;
const loc = map.getCenter()?.toJSON();
if (!loc) {
return;
}
// Call your handler here!
onDragEnd(loc);
}
});