2012-06-11 8 views
22

In meiner Google Maps-Anwendung habe ich eine Follow-Methode, die einem beweglichen Marker folgt. Wenn es folgt, möchte ich das Zoomen durch alle üblichen Methoden erlauben (dblclick, dblleftclick, mouwwheel und touch Ereignisse) und ich möchte das Panning jeder Art deaktivieren. Das Problem ist, dass beim Zoomen mit Mausrad und Doppelklick die Karte auf die Position der Maus geschwenkt wird. Ich kann alles gut deaktivieren, aber ich möchte das Zoomen erlauben. Ich habe das Mousewheel-Problem gelöst, indem ich das jquery mousewheel plugin benutzt und das Delta benutzt, um den Zoom zu ändern.Google Maps Deaktivieren des Benutzer-Panning für alle Ereignisse

Gibt es eine einfache Möglichkeit dies zu tun oder muss ich einen Listener für alle verschiedenen Touch- und Mausereignisse schreiben?

EDIT

Ich habe bereits Doppelklick deaktivieren, Mausrad zoomen und verschieben, aber ich will es immer noch die Doppelklick-Funktionalität haben. Ich möchte auch die Berührungsereignisse dort, aber ich möchte, dass sie von der Mitte her zoomen und nicht von der Stelle, an der das Ereignis passiert ist. Das eigentliche Problem ist die Replikation der Ereignisse, die Google bereits handhaben, aber die Funktionalität ein wenig

var options = { 
    disableDoubleClickZoom: true, 
    draggable: false, 
    scrollwheel: false, 
    panControl: false 
}; 

this.map = new google.maps.Map(document.getElementById('map'), options); 

Meine ideale Lösung wäre, sich ändern, wenn es eine disableDoubleClickPan und disableScrollwheelPan oder die draggable Option war tatsächlich verhindert alle Schleppen jeglicher Art

EDIT

Dies ist für alle Geräte, Desktop und Mobile.

+1

Warum deaktivieren Sie nicht "normales" Zoomen, indem Sie die Option disableDoubleClickZoom für die Karte verwenden und dann einen Ereignis-Listener für das Ereignis dblclick für eine Karte einrichten, die das vorhandene Kartenzentrum mit dem Symbol zoomt Zentrum "Eigentum". Das _ sollte_ das Schwenken deaktivieren. – andresf

+0

Das löst mein Problem nicht, es genügt ein Doppelklick, um das Ereignis neu zu schreiben. Mein echtes Problem ist das Berühren von Ereignissen wie Prise zum Zoomen. – georgephillips

+1

Vielleicht möchten Sie die Tatsache widerspiegeln, dass Sie in Ihrem Beitrag für mobile Geräte erstellen. – andresf

Antwort

2

Ich bin am Ende mit einer Kombination von Optionen gegangen. Zuerst musste ich Desktop-Ereignisse überschreiben, die auftraten, um mein erzieltes Ergebnis zu erhalten (Berührung, Doppelklick, Doppelklick links und Mausrad).

Auf einem Touch-Screen-Gerät habe ich alle Updates zu den Markern angehalten, wenn es mehr als zwei Berührungen gab. Das bedeutete, dass kein Pinch-Ereignis herumsprang, wenn der Zoom in Betrieb war.

Auf einem normalen Webdesktop-Gerät habe ich die Zoom- und Doppelklickereignisse auf der Karte deaktiviert und meine eigenen Event-Handler neu geschrieben.

Um zwischen ihnen zu unterscheiden, habe ich nach dem ontouchstart-Ereignis im Fensterobjekt gesucht.

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

Die zoom_changed oder idle Veranstaltungen, bei denen nicht wirklich eine Option für ein paar Gründe:

  1. Das idle Ereignis nur aufgerufen wird, wenn die Karte im Leerlauf und mit der Menge der Animation ich tat dies nie wurde angerufen.
  2. Die Animation bei jedem Schritt zentrierte die Karte auf den folgenden Markierungen neu, sodass das Ereignis zoom_changed den Mittelpunkt vor einem Animationsrahmen abrufen würde.
  3. Aufgrund der Menge an Animationen ist die Idee, nicht in die Mitte zu schwenken, um Animationsrahmen zu reduzieren und die Leistung zu verbessern.
+0

Wie pausieren Sie Marker-Updates, wenn Sie zwei Berührungen erkennen? – leon

2

Es ist zwar möglich zu argumentieren, dass beim Doppelklicken auf die Karte oder beim Zoomen der Karte die Mausposition nicht berücksichtigt werden muss (weil Sie auf das Kartenobjekt und nicht auf eine Position auf der Karte wirken) -zoom ist immer ortsabhängig, weil Sie die Karte um einen Standort physisch dehnen oder quetschen. Dieses Verhalten zu ändern wäre eindeutig nicht intuitiv.

In diesem Fall sollten Sie auf zoom_changed oder idle hören und dann die Karte auf neuere verschieben, damit der Benutzer sehen kann, was vor sich geht.

Sie könnte sogar diese Ereignisse verwenden, um das Standarddoppelklick- oder Mausradverhalten zu behandeln, so dass es offensichtlich ist, dass Sie die Ebene der Kontrolle ändern, die der Benutzer normalerweise hat.

16

Hier ist, wie ich es tat:

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

Wie Sie sehen können, das Setzen von maxZoom und minZoom auf den gleichen Wert Blockade Benutzer Doppelklick Ereignis hilft.

Verwandte Themen