2014-11-23 15 views
14

In Google Maps würde ich gerne die Mitte der Karte auf einer Markierung an meinem Standort behalten, wenn ich hinein- oder herauszoomen möchte. Es ist etwas, das Ingress macht, es ist egal, wo du doppelt tippst (oder doppelt klickst) oder wo du dich festklemmst, die Karte bleibt auf deinem Marker zentriert. So ist es möglich, ...Google Maps - beim Zoomen in der Mitte bleiben

Das Beste, was ich mit jetzt kam ist:

google.maps.event.addListener(mymap, 'zoom_changed', function() { 
    mymap.setCenter({lat: myLoc.lat, lng: myLoc.lon}); 
}) 

Aber es ist bei weitem nicht perfekt, es ist einfach wieder in den Mittelpunkt der Karte, nachdem der Benutzer bereits gezoomt ...

Vielen Dank!

[EDIT] absolut nichts hilft in der API ref ... Oder woanders bin ich blind und verpasste es!

+0

Versuchen Sie, auf den Karteneigenschaften – duncan

+0

auf "false" zu setzen. Das verhindert, dass man sich wegbewegt, was gut ist, aber nicht wegzoomen ... –

+0

Irgendwelches Glück dabei? Ich stoße auf dasselbe Problem. – floatleft

Antwort

2

Ich habe keine Ahnung, warum Sie diese Frage sowohl als Javascript als auch als Android markiert haben. Unter Android müssen Sie Ihr MapView in eine andere Ansicht einbinden und eine Doppeltippbewegung in onInterceptTouchEvent erkennen, die Sie überschreiben können, wenn Ihre Klasse beispielsweise FrameLayout überschreiben kann. Dann true zurück, um zu verhindern, dass die Karte dieses Ereignis behandelt, und Sie behandeln es stattdessen.

Für vollständigen Code bitte siehe meine Antwort hier: https://stackoverflow.com/a/30118649/764897

+1

wurde es zu einem profitablen Beitrag an anderer Stelle: D – Odaym

+0

Stellt sich heraus, das OP suchte nach einer JavaScript-Lösung, so dass diese Antwort leider nicht zutrifft. Ich suche auch nach einer Lösung, also werde ich ein Kopfgeld auf die Frage geben. –

3

Rein mit Javascript

  • Zuerst Scroll-Zoom-Funktion standardmäßig von google map von Scrollrads = false, deaktivieren
  • Als nächstes erstellen Sie benutzerdefinierte Scroll-Zoom-Funktion durch Mausereignis erfassen und Zoom-Level für Google Karte
einstellen

überprüfen Sie meinen Beispielcode: Fiddle URL: https://jsfiddle.net/vh3gqop0/5/

var map, i = 12; 
 
function initialize() { 
 
\t \t var myLatlng = new google.maps.LatLng(46.769603, 23.589957); 
 
\t \t var mapOptions = { 
 
\t \t \t center: myLatlng, 
 
\t \t \t zoom: i, 
 
\t \t \t scrollwheel: false, 
 
    \t \t disableDoubleClickZoom: true, 
 
\t \t \t mapTypeId: google.maps.MapTypeId.ROADMAP 
 
\t \t }; 
 
\t \t map = new google.maps.Map(document.getElementById("map_canvas"), 
 
\t \t \t mapOptions); 
 

 
\t \t var marker = new google.maps.Marker({ 
 
\t \t \t position: myLatlng, 
 
\t \t \t map: map, 
 
\t \t \t title: 'Any Title' 
 
\t \t }); 
 

 

 
\t } 
 

 
google.maps.event.addDomListener(window, 'load', initialize); 
 

 
$(document).ready(function() { 
 
    $('#map_canvas').on("wheel", function(evt){ 
 
    // console.log(evt.originalEvent.deltaY); 
 
    \t \t if(evt.originalEvent.deltaY > 0){ 
 
     \t map.setZoom(++i); 
 
     }else { 
 
     \t map.setZoom(--i); 
 
     } 
 
    \t \t 
 
    }); 
 
});
#map_canvas{ 
 
    height:400px; 
 
    width:100%; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> 
 
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC9d3jaUX6Qdr0Uzvq6fQXVmZ1PBuHEVAQ"></script> 
 
<div id="map_canvas"></div>

+1

Wenn Sie versuchen, nach dem Ziehen zu vergrößern/verkleinern, wird die Mitte geändert. Und so funktioniert es nicht. Sie denken, Sie können das Ziehen deaktivieren, indem Sie in den Kartenoptionen "ziehbar: falsch" setzen. Ihre Antwort wurde entsprechend aktualisiert. –

+0

Dieses Beispiel aktualisiert die aktuelle Zoomstufe nicht. Wenn Sie versuchen, mit den UI-Steuerelementen zu zoomen, wird das 'i' nicht aktualisiert und die Zoomfunktion wird durcheinander gebracht. – Erevald

+0

@Erevald wegen dieses Beispielcodes für meine Lösung, ich weiß, dass Sie mehr Fall dafür haben, aber meine Lösung ist Kern und jeden Fall, den Sie zeigen können, versuchen Sie, meine Lösung zu verwenden, die Sie auflösen können: D. – HoangHieu

2

Leider Google Maps Api dieses Verhalten nicht bieten.

Das folgende Beispiel benötigt jQuery nicht und unterstützt das Doppelklicken und Mausscrollen. Sie können jedoch weitere Ereignisse hinzufügen, wenn Sie möchten.

Blick in Codepen

Disable:

  • Doppel-clickin
  • Scrolling
  • Schwenk

dblclick und zoom_changed Ereignisse auf der Karte hinzufügen und eine mousewheel Veranstaltung auf die Segeltuch.

Ich habe den Code kommentiert, hoffentlich funktioniert das für Ihren Fall. Denken Sie daran, dass Sie die Mausradgeschwindigkeit für alle Browser und Geräte normalisieren müssen. Hammer.js ist dafür eine gute Bibliothek.

var map, zoom; 
 

 
function initialize() { 
 

 
    // The white house! 
 
    var myLatLng = new google.maps.LatLng(38.8977, -77.0365); 
 

 
    // Default zoom level 
 
    zoom = 17; 
 

 
    // Keep a reference for evens 
 
    var $map = document.getElementById("map"); 
 

 
    // Disable scrolling + double-click + dragging 
 
    map = new google.maps.Map($map, { 
 
    zoom: zoom, 
 
    center: myLatLng, 
 
    mapTypeId: google.maps.MapTypeId.ROADMAP, 
 
    scrollwheel: false, 
 
    disableDoubleClickZoom: true, 
 
    //draggable: false 
 
    }); 
 

 
    var marker = new google.maps.Marker({ 
 
    position: myLatLng, 
 
    map: map 
 
    }); 
 

 

 
    // EVENTS 
 

 
    // Double Click: event zoom by 1 
 
    map.addListener('dblclick', function(e) { 
 
    zoomHandler(e.latLng, 1); 
 
    }); 
 

 
    // Zoom changed: update current zoom level 
 
    map.addListener('zoom_changed', function(e) { 
 
    // Using a timeout because `getZoom()` does not return a promise. 
 
    setTimeout(function() { 
 
     zoom = map.getZoom(); 
 
    }, 50); 
 

 
    }); 
 

 
    // Dom event: On mousewheel 
 
    $map.addEventListener('mousewheel', wheelEvent, true); 
 
} 
 

 
// Mouse Scrolling event 
 
function wheelEvent(event) { 
 
    if (event.deltaY > 1) 
 
    zoomHandler(event, -1); 
 
    else 
 
    zoomHandler(event, 1); 
 
} 
 

 
// Zoom in/out 
 
function zoomHandler(event, zoomin) { 
 
    zoom += zoomin; 
 
    map.setZoom(zoom); 
 
} 
 

 
google.maps.event.addDomListener(window, 'load', initialize);
#map { 
 
    width: 100%; 
 
    height: 240px; 
 
}
<div id="map"></div> 
 
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC9d3jaUX6Qdr0Uzvq6fQXVmZ1PBuHEVAQ"></script>

+0

Hinzugefügt ein Codepen und erwähnte über die Notwendigkeit, Mausrad Geschwindigkeit und/oder Pinch Ereignisse zu normalisieren. – Erevald

+0

Ich habe den Codepen auf Chrome 57 auf Android versucht, aber ich kann nicht die Karte zoomen oder zoomen. –

+0

Sie können jetzt schwenken, ich habe im Moment keinen Android, um Pinch-Zoom zu testen, aber der Code, den ich gepostet habe, sollte das Standardverhalten nicht blockieren. Wie gesagt, es muss eine Normalisierung der Werte zwischen verschiedenen Arten von Ereignissen geben, um eine reibungslose Erfahrung zu erzielen. – Erevald

0

sollten Sie versuchen, die center_changed Ereignis mit panTo Funktion.

google.maps.event.addListener(mymap, 'center_changed', function() { 
    mymap.panTo({lat: myLoc.lat, lng: myLoc.lon}); 
}) 

Sie können über panTo Funktion here ein Beispiel darüber here und Dokumentation. Becareful, sollte es alle ziehbare Sache durcheinander bringen.

+0

Dieses Beispiel wird eine Endlosschleife erhalten. – HoangHieu

+0

Es tut mir leid, ich werde das 'setCenter' auf' panTo' fixieren; Danke für deine Antwort @HoangHieu –

Verwandte Themen