miałem ten sam problem. Oto, w końcu udało mi się rozwiązać kilka problemów, które miałem z innymi rozwiązaniami.
* Właściwie wymusza granic niezależnie od tego, czy chcesz korzystać z myszki lub klawiszy strzałek
* nie zatrzymuje się blisko brzegu, jeśli przytrzymać klawisze strzałek, ze względu na przyspieszenie patelni powodując jej „przeregulowanie” THE Krawędź w jednym kroku, więc zamiast tego zatrzymuje się na krótko (spróbuj przytrzymać klawisz strzałki w jednym kierunku, aż uderzysz o krawędź, a następnie zwolnij i naciśnij ponownie, a przy niektórych rozwiązaniach będzie przewijać tylko trochę więcej)
* Nie "odbija się", gdy uderzy w krawędź
* Prawidłowo wymusza ograniczenia w przypadku zmiany powiększenia
EDYCJA: OK, więc działa po zmianie powiększenia za pomocą kółka przewijania, ale nie przy użyciu regulatora zoomu. Pozwól mi trochę się pobawić, a zobaczę, czy mogę sprawić, że to działa ...
EDIT 2: Okazało się, problem polegał na tym, że usunąłem kontrolę panoramy. Dopóki kontrola pan jest obecna, działa to dobrze, zarówno za pomocą pokrętła jak i regulatora zoomu.
EDYCJA 3: Nie ... to nie było to. Zaktualizowałem kod, aby obsłużyć sterowanie powiększeniem.
// bounds of the desired area
var allowedBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(-64, -64),
new google.maps.LatLng(64, 64)
);
var zoomChanged = false;
google.maps.event.addListener(map, 'center_changed', function() {
var mapBounds = map.getBounds();
if(mapBounds.getNorthEast().lat() > allowedBounds.getNorthEast().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() -
(mapBounds.getNorthEast().lat() -
allowedBounds.getNorthEast().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getNorthEast().lng() > allowedBounds.getNorthEast().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() -
(mapBounds.getNorthEast().lng() -
allowedBounds.getNorthEast().lng()), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lat() < allowedBounds.getSouthWest().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() +
(allowedBounds.getSouthWest().lat() -
mapBounds.getSouthWest().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lng() < allowedBounds.getSouthWest().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() +
(allowedBounds.getSouthWest().lng() -
mapBounds.getSouthWest().lng()), true);
map.panTo(newCenter);
return;
}
}, this);
google.maps.event.addListener(map, 'zoom_changed', function() {
zoomChanged = true;
}, this);
google.maps.event.addListener(map, 'bounds_changed', function() {
if(zoomChanged) {
var mapBounds = map.getBounds();
if(mapBounds.getNorthEast().lat() > allowedBounds.getNorthEast().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() -
(mapBounds.getNorthEast().lat() -
allowedBounds.getNorthEast().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getNorthEast().lng() > allowedBounds.getNorthEast().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() -
(mapBounds.getNorthEast().lng() -
allowedBounds.getNorthEast().lng()), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lat() < allowedBounds.getSouthWest().lat()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat() +
(allowedBounds.getSouthWest().lat() -
mapBounds.getSouthWest().lat()),
map.getCenter().lng(), true);
map.panTo(newCenter);
return;
}
if(mapBounds.getSouthWest().lng() < allowedBounds.getSouthWest().lng()) {
var newCenter = new google.maps.LatLng(map.getCenter().lat(),
map.getCenter().lng() +
(allowedBounds.getSouthWest().lng() -
mapBounds.getSouthWest().lng()), true);
map.panTo(newCenter);
return;
}
zoomChanged = false;
}
}, this);
użycie zdarzenia bounds_changed zamiast zoom_changed w tym przypadku jest nonsensem. Będzie strzelał przy każdej okazji, gdy zmieni się granice, ale interesują go tylko przypadki, gdy zmieniony jest zoom. – TMS
@ tomas-t Nie zgadzam się, że obsługa zdarzenia bounds_changed jest "nonsensem". Jeśli przekraczasz granicę po zmianie powiększenia, czy nie możesz sprawdzić funkcji getZoom w ramce obsługi bounds_change? Opublikowana przeze mnie dokumentacja uzasadnia zachowanie (błąd dotyczący krawędzi), ale obejście tego problemu wydaje mi się dość proste. – RedBlueThing
oczywiście możesz, ale dla rzeczy, którą OP chce obsługiwać zdarzenie bounds_changed zamiast zoom_changed jest niepotrzebna przesada, ponieważ zdarzenie uruchomi się nawet podczas przesuwania itp. Spójrz na obejście w mojej odpowiedzi. – TMS