Powinieneś użyć CameraUpdate
klasy do (prawdopodobnie) wszystkich programowych ruchów mapy.
Aby to zrobić, najpierw obliczyć granice wszystkich znaczników:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Następnie uzyskaj obiekt opisu ruchu za pomocą fabryki CameraUpdateFactory
:
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Na koniec przenieś mapę:
googleMap.moveCamera(cu);
Lub jeśli chcesz animację:
googleMap.animateCamera(cu);
To wszystko :)
Wyjaśnienie 1
Prawie wszystkie metody ruchu wymagają, aby Map
obiekt przeszedł proces układu. Możesz poczekać, aż tak się stanie, używając addOnGlobalLayoutListener
konstruktu. Szczegóły można znaleźć w komentarzach do tej odpowiedzi i pozostałych odpowiedzi. Można również znaleźć kompletny kod do ustawiania zakresu przy użyciu mapy addOnGlobalLayoutListener
tutaj .
Wyjaśnienie 2
Jeden komentarz zauważa, że użycie tej metody tylko dla jednego znacznika powoduje, że powiększenie mapy ustawione jest na „dziwny” poziom powiększenia (który moim zdaniem jest maksymalnym poziomem powiększenia dostępnym dla danej lokalizacji). Myślę, że jest to oczekiwane, ponieważ:
LatLngBounds bounds
Wystąpienie będzie miał northeast
właściwość równej southwest
, co oznacza, że część powierzchni ziemi objętej to bounds
jest dokładnie zero. (Jest to logiczne, ponieważ pojedynczy znacznik nie ma obszaru.)
- Przekazując
bounds
do CameraUpdateFactory.newLatLngBounds
ty zasadniczo zażądać obliczenia takiego poziomu, że zoom bounds
(o zerowej powierzchni) obejmie cały widok mapy.
- Możesz faktycznie wykonać te obliczenia na kartce papieru. Teoretyczny poziom powiększenia będący odpowiedzią wynosi + ∞ (dodatnia nieskończoność). W praktyce
Map
obiekt nie obsługuje tej wartości, więc jest zaciśnięty na bardziej rozsądnym maksymalnym poziomie dozwolonym dla danej lokalizacji.
Innymi słowy: skąd Map
obiekt może wiedzieć, jaki poziom powiększenia powinien wybrać dla pojedynczej lokalizacji ? Może optymalna wartość powinna wynosić 20 (jeśli reprezentuje określony adres). A może 11 (jeśli reprezentuje miasto). A może 6 (jeśli reprezentuje kraj). Interfejs API nie jest tak inteligentny, a decyzja należy do Ciebie.
Dlatego powinieneś po prostu sprawdzić, czy markers
ma tylko jedną lokalizację, a jeśli tak, użyj jednego z:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- przejdź do pozycji znacznika i pozostaw nienaruszony aktualny poziom powiększenia.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- przejdź do pozycji znacznika, ustaw poziom powiększenia na dowolnie wybraną wartość 12.