Como la suerte lo tendría, Quería lograr el mismo efecto recientemente, y encontré una solución, sobre la que hice a post. Básicamente, solo establecer un tiempo de espera para cada transición no es suficiente, ya que podría resultar fácilmente en un tipo de "inicio-parada" si el efecto de zoom de Google aún no ha finalizado o ha terminado hace mucho tiempo.
Como mencionó Martin, hay algunas desventajas en esto, que no voy a reiterar. Si lo utiliza al final es su elección, y depende en gran medida de la potencia de la CPU y/o el navegador de sus usuarios. Sin embargo, es un efecto agradable, y seguro que impresionará a algunos, cuando se usa con prudencia.
Mi solución fue la siguiente:
// example marker:
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(-20.3,30.3)
});
// add the double-click event listener
google.maps.event.addListener(marker, 'dblclick', function(event){
map = marker.getMap();
map.setCenter(overlay.getPosition()); // set map center to marker position
smoothZoom(map, 12, map.getZoom()); // call smoothZoom, parameters map, final zoomLevel, and starting zoom level
});
// the smooth zoom function
function smoothZoom (map, max, cnt) {
if (cnt >= max) {
return;
}
else {
z = google.maps.event.addListener(map, 'zoom_changed', function(event){
google.maps.event.removeListener(z);
smoothZoom(map, max, cnt + 1);
});
setTimeout(function(){map.setZoom(cnt)}, 80); // 80ms is what I found to work well on my system -- it might not work well on all systems
}
}
Básicamente lo que se pretende es ajustar el nivel de zoom a uno, que detecta el evento zoom_changed
, a la espera de 80 ms antes de ajustar el nivel de zoom por uno nuevo, etc. Lo que es bueno de esto es que el evento zoom_changed
parece ser llamado después de la transición suave proporcionada por Google Maps, pero antes de las imágenes reales se cargan, por lo que no desperdicia ancho de banda demasiado.
Los 80ms en el tiempo de espera también son un número mágico que se me ocurrió - sería aconsejable hacer una prueba más exhaustiva y ver qué funciona en diferentes sistemas y navegadores, y quizás cambiar el algoritmo ligeramente en función de su hallazgos o para diferentes sistemas.
Probablemente tampoco sea necesario agregar y eliminar el oyente cada vez, pero puede realizar esa pequeña mejora si lo desea.
Gracias, voy a echar un vistazo! – PeanutButterJelly
¡Funciona como un encanto! En lugar de setCenter, si usa panTo se ve mejor ...;) –
Sería inteligente eliminar ese '' self' para evitar confusiones –