2011-08-10 34 views
6

Có cách nào để vô hiệu hóa quán tính kéo trên Google Maps V3 không? Có vẻ như nó phải là một MapOption, nhưng tôi không thể tìm thấy bất kỳ cách nào để làm điều này.Tắt tính quán tính/đà kéo trên Google Maps V3

+0

Tôi đoán đây là một vấn đề được biết đến với không có giải pháp? – pixelfreak

Trả lời

4

Tôi chạy vào vấn đề này cùng một ngày hôm nay, với một số tùy chỉnh nổi của Div trên bản đồ cần phải được tái định vị trên bản đồ di chuyển. Việc thay đổi vị trí của tôi hoạt động tốt miễn là người dùng dừng hẳn sau khi kéo chuột trước khi cho phép chuột đi (vì vậy sẽ không có động lượng), nhưng nếu chỉ cần kéo nhanh và phát hành div sẽ kết thúc một chút.

Để sửa lỗi này, tôi nối vào sự kiện kéo và các sự kiện nhàn rỗi:

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); }); 

Điều gì xảy ra sau khi bạn đã kéo và bản đồ đã đi đến một điểm dừng (sau đà được thực hiện) bản đồ 'snaps' trở lại vị trí.

Nếu quá trình chụp quá đột ngột, người ta có thể panTo hoặc làm động động chuyển động theo một cách nào đó. Hy vọng rằng sẽ giúp, nó không hoàn hảo, nhưng đó là một cách để đảo ngược đà từ một sự kiện kéo.

+1

Kể từ v3, bạn có thể móc vào sự kiện 'center_changed' sẽ tính thời gian giữa các sự kiện' dragend' và 'idle'. https://developers.google.com/maps/documentation/javascript/events –

+0

@DevinMcInnis Đúng vậy. Điều này cũng đã được thảo luận về vấn đề mở trên mã google tại đây: https://code.google.com/p/gmaps-api-issues/issues/detail?id=3543&q=idle&colspec=ID%20Type%20Status%20Introduced% 20Fixed% 20Summary% 20Stars% 20ApiType% 20Internal Cụ thể: "Trường hợp sử dụng này có thể được giải quyết bằng cách thêm một' idle' listener khi một sự kiện 'dragend' được kích hoạt. Để định vị lớp phủ, hãy sử dụng 'bounds_changed' hoặc' center_changed' thay vì 'drag'" – EdgeCaseBerg

0

Tôi khá chắc chắn rằng ít nhất có thể phản tác dụng động lượng. Ai đó hãy sửa tôi nếu tôi sai! Để đơn giản, ví dụ: giả sử vùng chứa bản đồ của bạn có một số width của 100vwheight của 100vh. Bạn chỉ cần gọi getCenter() trong một hàm được gọi bởi sự kiện mouseup và sau đó sử dụng các tọa độ đó ngay lập tức 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)); 
    }; 
}; 

Đoạn mã trên thực sự hoạt động, nhưng kicker là nó chỉ có tác dụng một lần cho đến khi trình duyệt trở nên dường như quá tải và tạo ra các lỗi của router RangeError: kích thước gọi stack tối đa vượt quá.

Bạn không chắc chắn phải làm gì bây giờ.

Thông tin thêm về điều này here.

+0

Trình nghe center_changed đặt trung tâm bản đồ, sẽ kích hoạt sự kiện center_changed, tạo vòng lặp vô hạn – geocodezip

+0

@geocodezip Cảm ơn bạn đã trả lời. Tôi nhận ra rằng một thời gian ngắn trước đây, điều thú vị là bạn sẽ mong đợi nó hoạt động hoàn hảo mà không cần thêm 'myMap.addListener ...' nhưng nó không hoạt động như thể mã không tồn tại hãy kiểm tra chủ đề khác của tôi. http://stackoverflow.com/questions/39626454/functions-uncaught-rangeerror-maximum-call-stack-size-exceeded-with-google-m –

5

Sử dụng tùy chọn không có giấy tờ disablePanMomentumví dụ .:

new google.maps.Map(document.getElementById(id), { 
    disablePanMomentum: true, 
    backgroundColor: 'none', 
    disableDefaultUI: true, 
    center: { 
     lat: 40.674, 
     lng: -73.945 
    }, 
    zoom: 2, 
    ... 
+0

Đẹp nhất. –

+1

@PedroAdameVergara Kỹ thuật đảo ngược mở rộng hoặc một số kỹ năng regex cơ bản Hãy chọn lựa của bạn – Orwellophile

+0

@Orwellophile có thể giải thích cách yo u sẽ sử dụng regexs để tìm ra điều này? Tôi rất muốn biết, cổ vũ –

Các vấn đề liên quan