javascript - example - Google Maps Inhabilita el paneo del usuario en todos los eventos
google.maps.marker example (3)
En mi aplicación Google Maps tengo un método de seguimiento que sigue a un marcador en movimiento. Cuando está siguiendo quiero permitir el acercamiento a través de todos los métodos habituales (dblclick, dblleftclick, mousewheel y touch events) y quiero desactivar el panorama de cualquier tipo. El problema es que al acercar con la rueda del mouse y hacer doble clic, el mapa se desplaza a la posición del mouse. Puedo desactivar todo muy bien, pero quiero permitir el uso del zoom. He resuelto el problema del mouse con el plugin jquery mousewheel y el delta para cambiar el zoom.
¿Hay alguna manera fácil de hacer esto o tengo que escribir un oyente para todos los diferentes eventos de toque y mouse?
EDITAR
Ya deshabilité el doble clic, acercar y arrastrar la rueda del mouse, pero quiero que la funcionalidad de doble clic siga allí. También quiero que los eventos toquen allí, pero quiero que se vean desde el centro en lugar de desde donde sucedió el evento. El problema real es replicar los eventos que google ya maneja pero cambiar la funcionalidad un poco
var options = {
disableDoubleClickZoom: true,
draggable: false,
scrollwheel: false,
panControl: false
};
this.map = new google.maps.Map(document.getElementById(''map''), options);
Mi solución ideal sería si hubiera un disableDoubleClickPan
y disableScrollwheelPan
o si la opción actual que se puede arrastrar evita cualquier arrastre de cualquier tipo
EDITAR
Esto es para todos los dispositivos, computadoras de escritorio y dispositivos móviles.
Así es como lo hice:
var options = {
draggable: false,
scrollwheel: false,
panControl: false,
maxZoom: Zoom,
minZoom: Zoom,
zoom: Zoom,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
Como puede ver, establecer maxZoom y minZoom en el mismo valor ayuda a bloquear el evento de doble clic del usuario.
He terminado yendo con una combinación de opciones. En primer lugar, tuve que anular los eventos de escritorio que ocurrieron para obtener el resultado que obtuve (tocar, hacer doble clic, doble clic con el botón izquierdo y la rueda del mouse).
En un dispositivo de pantalla táctil detuve todas las actualizaciones de los marcadores cuando había más de dos toques. esto significaba que cualquier evento de pellizco no saltaba cuando el zoom estaba en funcionamiento.
En un dispositivo de escritorio web normal desactivé el zoom y hago doble clic en eventos en el mapa y reescribí mis propios manejadores de eventos.
Para distinguir entre ellos, verifiqué el evento ontouchstart en el objeto ventana.
function setDraggable(draggable) {
if ("ontouchend" in document) {
return;
}
var options = {
draggable: draggable,
panControl: draggable,
scrollwheel: draggable
};
this.map.setOptions(options);
},
Los eventos zoom_changed
o idle
no son realmente una opción por algunas razones:
- El evento
idle
solo se invoca cuando el mapa está inactivo y con la cantidad de animación que estaba haciendo esto nunca se llamó. - La animación en cada paso retrocedió el mapa en los marcadores seguidos, por lo que el evento
zoom_changed
recuperaría el recentro antes de un cuadro de animación. - Debido a la cantidad de animación, la idea de no realizar panorámicas en el centro es reducir los cuadros de animación y mejorar el rendimiento.
Si bien es posible argumentar que al hacer doble clic en el mapa o al acercar el mapa no es necesario tener en cuenta la ubicación del mouse (porque estás actuando sobre el objeto del mapa en lugar de sobre una ubicación en el mapa), pellizcar para acercar es siempre depende de la ubicación porque estira o aplasta físicamente el mapa alrededor de una ubicación. Modificar ese comportamiento sería claramente poco intuitivo.
En este caso, debe escuchar zoom_changed
o idle
y luego desplazar el mapa a la ubicación reciente para que el usuario pueda ver lo que está sucediendo.
Incluso podría usar esos eventos para manejar el comportamiento predeterminado de doble clic o rueda de mouse para que sea obvio que está cambiando el nivel de control que normalmente tiene el usuario.