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 Mapobiekt przeszedł proces układu. Możesz poczekać, aż tak się stanie, używając addOnGlobalLayoutListenerkonstruktu. 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 addOnGlobalLayoutListenertutaj .
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 boundsWystąpienie będzie miał northeastwłaściwość równej southwest, co oznacza, że część powierzchni ziemi objętej to boundsjest dokładnie zero. (Jest to logiczne, ponieważ pojedynczy znacznik nie ma obszaru.)
- Przekazując
boundsdo CameraUpdateFactory.newLatLngBoundsty 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
Mapobiekt 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 Mapobiekt 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 markersma 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.