2009-05-03 37 views
18

Tôi tự hỏi làm thế nào tôi có được sự phóng to mượt mà trong hoạt ảnh với API Google Maps.Google Maps zoomOut-Pan-zoomIn hoạt ảnh

Tôi có 2 điểm, một điểm, giả sử Trung Quốc và một ở Pháp. Khi tôi phóng to ở Trung Quốc, và bấm vào nút France. Tôi muốn nó dần dần thu nhỏ mịn, một mức thu phóng vào thời điểm đó. Khi thu nhỏ, nó sẽ chuyển sang vị trí mới, sau đó phóng to ở vị trí mới một mức thu phóng tại thời điểm đó.

Làm thế nào tôi có thể làm điều này?

Trả lời

16

Bạn cần phương pháp zoomOut với tham số thu phóng liên tục được đặt để thực hiện thu phóng và phương pháp panTo để thực hiện thao tác quét trơn tru đến điểm giữa mới.

Bạn có thể lắng nghe những zoomEndmoveEnd sự kiện trên đối tượng bản đồ để chuỗi lại với nhau bạn zoomOut, panTozoomIn phương pháp.

EDIT:

Vì vậy, trong quá trình thực hiện một mẫu cho vấn đề này, tôi phát hiện ra rằng doContinuousZoom param trên ZoomInZoomOut (hoặc chỉ cần EnableContinuousZoom trên bản đồ) không thực hiện khá công như mong đợi. Nó hoạt động ok khi phóng to, nếu các tile nằm trong cache (đây là một điểm quan trọng, nếu các tile không được lưu trữ thì nó không thực sự có thể có được animation mượt mà mà bạn đang sử dụng). các ô để mô phỏng hoạt ảnh thu phóng mượt mà và giới thiệu độ trễ ~ 500 ms trên mỗi bước thu phóng để bạn có thể làm điều đó một cách không đồng bộ (không giống như panTo, mà bạn sẽ thấy trong ví dụ của tôi, tôi sử dụng setTimeout để gọi async).

Thật không may là điều này cũng không đúng đối với phương pháp zoomIn, chỉ nhảy đến mức thu phóng mục tiêu mà không có hình động thu nhỏ cho từng mức thu phóng. Tôi đã không cố gắng thiết lập rõ ràng phiên bản cho mã bản đồ google, vì vậy đây có thể là một cái gì đó được sửa trong các phiên bản sau. Dù sao, đây là sample code mà hầu như chỉ là javascript hoop nhảy và không quá nhiều với các API của Google Maps:

http://www.cannonade.net/geo.php?test=geo2

Bởi vì phương pháp này có vẻ hơi không đáng tin cậy, tôi nghĩ rằng nó sẽ có ý nghĩa hơn để làm việc xử lý async cho setZoom một cách rõ ràng (Giống như các công cụ panning).

EDIT2:

Vì vậy, tôi làm async phóng to một cách rõ ràng bây giờ (sử dụng setTimeout với zoom duy nhất tại một thời điểm). Tôi cũng phải kích hoạt các sự kiện khi mỗi lần thu phóng diễn ra để chuỗi sự kiện của tôi chính xác. Có vẻ như các sự kiện zoomEnd và panEnd đang được gọi đồng bộ.

Cài đặt enableContinuousZoom trên bản đồ dường như không hoạt động, vì vậy tôi đoán gọi zoomOut, zoomIn với param là cách duy nhất để làm việc đó.

+0

tôi biết mình phải làm một cái gì đó như thế, những gì tôi đang tự hỏi là làm thế nào tôi chính xác tôi sẽ làm điều đó? –

+0

Tôi sẽ đăng một số mã ngay khi có cơ hội ... – RedBlueThing

+0

Cảm ơn, mong chờ nó;) –

3

Đây là cách tiếp cận của tôi.

var point = markers[id].getPosition(); // Get marker position 
map.setZoom(9); // Back to default zoom 
map.panTo(point); // Pan map to that position 
setTimeout("map.setZoom(14)",1000); // Zoom in after 1 sec 
+0

+1 Dễ dàng phương pháp với ít nhất nhức đầu – tetris11

+2

Đây là một giải pháp rất giật. Tôi sẽ không khuyên bạn nên nó. Tôi đã làm nó trong tuần này và nó không đủ khả thi. Ngay cả chảo quá nhanh và tuyến tính và vì vậy tôi đã viết kịch bản làm chậm nó xuống và làm cho nó theo cấp số nhân trong sự giảm tốc. tôi sẽ đi với giải pháp của RedBlueThing. –

+1

mũ là chắc chắn tốt hơn nhiều trong phương pháp này, nhưng vẫn không đủ tốt. Tôi cảm thấy nó cần phải được làm panning và phóng to cùng một lúc để trông thật mịn ... Tôi không biết làm thế nào mặc dù – Arch1tect

3
var zoomFluid, zoomCoords; //shared variables 

function plotMarker(pos, name){ 
    var marker = new google.maps.Marker({ 
     map: map, 
     title:name, 
     animation: google.maps.Animation.DROP, 
     position: pos 
    }); 
    google.maps.event.addListener(marker, 'click', function(){ 
      zoomCoords = marker.getPosition();  //Updates shared position var 
      zoomFluid = map.getZoom();   //Updates shared zoom var; 
      map.panTo(zoomCoords);  //initial pan 
      zoomTo();     //recursive call 
    }); 

} 

// increases zoomFluid value at 1/2 second intervals 
function zoomTo(){ 
    //console.log(zoomFluid); 
    if(zoomFluid==10) return 0; 
    else { 
     zoomFluid ++; 
     map.setZoom(zoomFluid); 
     setTimeout("zoomTo()", 500); 
    } 
} 
0

Đối với zoom này làm việc cho tôi độc đáo:

function animateMapZoomTo(map, targetZoom) { 
    var currentZoom = arguments[2] || map.getZoom(); 
    if (currentZoom != targetZoom) { 
     google.maps.event.addListenerOnce(map, 'zoom_changed', function (event) { 
      animateMapZoomTo(map, targetZoom, currentZoom + (targetZoom > currentZoom ? 1 : -1)); 
     }); 
     setTimeout(function(){ map.setZoom(currentZoom) }, 80); 
    } 
} 
+0

cùng một câu trả lời là https://stackoverflow.com/a/34007969/5279156 –