2012-06-11 10 views
22

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.Google Maps Inhabilitar el paneo del usuario en todos los eventos

¿Hay alguna manera fácil de hacer esto o tengo que escribir un oyente para todos los diferentes eventos de toque y mouse?

EDITAR

tengo ya desactivar el doble clic, la rueda del ratón y arrastrando el zoom, pero yo quiero tener la funcionalidad doble clic todavía 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 está replicando los acontecimientos que Google ya manejar, pero cambiar la funcionalidad de 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 había una disableDoubleClickPan y disableScrollwheelPan o los draggable opción evita reales de todo arrastre de cualquier tipo

EDITAR

Esto es para todos los dispositivos, de escritorio y móviles.

+1

Por qué no desactivar el zoom "normal" utilizando la opción 'disableDoubleClickZoom' para el mapa y luego configurar un detector de eventos para el evento' dblclick' para un mapa que se acerca utilizando el centro de mapas existente (capturado mediante el ' propiedad del centro). Eso _debería_ desactivar el paneo. – andresf

+0

Eso no soluciona mi problema, solo me lleva el doble clic para que reescriba el evento. Mi verdadero problema es tocar eventos como pellizcar para ampliar. – georgephillips

+1

Es posible que desee reflejar el hecho de que está creando para dispositivos móviles en su publicación. – andresf

Respuesta

2

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 comprobé el evento ontouchstart en el objeto de la ventana.

function setDraggable(draggable) { 
    if ("ontouchend" in document) { 
     return; 
    } 
    var options = { 
     draggable: draggable, 
     panControl: draggable, 
     scrollwheel: draggable 
    }; 
    this.map.setOptions(options); 
}, 

Los zoom_changed o idle eventos en los que no es realmente una opción para algunas razones:

  1. El evento idle solamente es llamado cuando el mapa está en reposo y con la cantidad de animación que estaba haciendo esto nunca fue llamado.
  2. La animación en cada paso recolocaba el mapa en los marcadores seguidos, por lo que el evento zoom_changed recuperaría el recentro antes de un cuadro de animación.
  3. 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.
+0

¿Cómo pausa las actualizaciones de marcador cuando detecta dos toques? – leon

2

Si bien es posible argumentar que al hacer doble clic en el mapa o acercar el mapa no es necesario tener en cuenta la ubicación del mouse (porque está actuando sobre el objeto del mapa en lugar de sobre una ubicación en el mapa), pellizcar -zoom 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 desplazarse por el mapa hasta la ubicación actual para que el usuario pueda ver lo que está sucediendo.

Usted podría usar esos eventos para manejar el comportamiento predeterminado de doble clic o rueda de ratón para que sea obvio que está cambiando el nivel de control que el usuario normalmente tiene.

16

Aquí es cómo lo hice:

var options = { 
    draggable: false, 
    scrollwheel: false, 
    panControl: false, 
    maxZoom: Zoom, 
    minZoom: Zoom, 
    zoom: Zoom, 
    center: latlng, 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

Como se puede ver, el establecimiento de MaxZoom y minZoom al mismo valor ayuda evento de doble clic del usuario bloque.

Cuestiones relacionadas