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.
addOnGlobalLayoutListener()
lubpost()
odpowiednieRunnable
. To jest właśnie powód, dla którego coraz współrzędne ekranu marker nie można zrobić wonCreate
- patrz stackoverflow.com/q/14429877/1820695 Jednak ty możesz korzystać z niektórych metod zanim układ działo się - np.CameraUpdateFactory.newLatLngBounds()
z 4 parametrami .Google Map V2
Poniższe rozwiązanie działa w systemie Android Marshmallow 6 (API 23, API 24, API 25, API 26, API 27, API 28). Działa również w Xamarin.
źródło
Więc
na przykład twoja mapa Google znajduje się w RelativeLayout:
źródło
Nie mogłem użyć onGlobalLayoutlistener, więc oto inne rozwiązanie, aby zapobiec
"Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions."
błędowi:źródło
Z tego kodu wyświetlam wiele znaczników ze szczególnym powiększeniem na ekranie mapy.
// Zadeklarowane zmienne
// Metoda dodawania wielu punktów znaczników za pomocą ikony do rysowania
// Do dodawania wielu znaczników widocznych na mapie
źródło
Uwaga - To nie jest rozwiązanie pierwotnego pytania. Jest to rozwiązanie jednego z podproblemów omówionych powyżej .
Rozwiązanie @andr Clarification 2 -
Jest to naprawdę problematyczne, gdy w granicach jest tylko jeden znacznik, dzięki czemu poziom powiększenia jest ustawiony na bardzo wysoki poziom ( poziom 21 ). Google nie zapewnia w żaden sposób ustawienia maksymalnego poziomu powiększenia w tym momencie. Może się to również zdarzyć, gdy jest więcej niż 1 znacznik, ale wszystkie są bardzo blisko siebie. Wtedy pojawi się również ten sam problem.
Rozwiązanie - Załóżmy, że chcesz, aby mapa nigdy nie przekraczała 16-krotnego powiększenia. Następnie po zrobieniu -
Sprawdź, czy poziom powiększenia przekroczył poziom 16 (lub cokolwiek chcesz) -
A jeśli ten poziom jest większy niż 16, co będzie tylko wtedy, gdy znaczników będzie bardzo mało lub wszystkie znaczniki będą bardzo blisko siebie, po prostu pomniejsz mapę w tej konkretnej pozycji tylko przez ustawienie poziomu powiększenia na 16.
W ten sposób nigdy nie będziesz mieć problemu z „dziwacznym” poziomem powiększenia wyjaśnionym bardzo dobrze przez @andr.
źródło
pomogłoby to .. z demo Google apis
dla jasnych informacji spójrz na ten adres URL. https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java
źródło
Miałem podobny problem, użycie następującego kodu rozwiązało problem:
CameraUpdateFactory.newLatLngBounds(bounds, 200, 200, 5)
ogólnie różnice lokalizacji w moim przypadku nie przekraczają dwóch sąsiednich miast.powiększ, aby dopasować wszystkie znaczniki na mapie Google Maps v2
źródło
Pokaż wszystkie znaczniki z mapą Google
W tych metodach przechowuj wszystkie markery i automatycznie powiększaj, aby pokazać wszystkie markery na mapie google.
źródło
Użyj metody „getCenterCoordinate”, aby uzyskać współrzędną środkową i użyj jej w CameraPosition.
źródło
Mam jeszcze jeden sposób, aby to samo działało idealnie. więc pomysł, aby pokazać wszystkie znaczniki na ekranie, potrzebujemy środkowej długości i poziomu powiększenia. tutaj jest funkcja, która da wam oboje i będzie potrzebowała wszystkich obiektów Latlng znacznika jako danych wejściowych.
Ta funkcja zwraca obiekt Para, którego możesz użyć podobnie
możesz zamiast używać wypełnienia, aby trzymać swoje znaczniki z dala od granic ekranu, możesz dostosować powiększenie o -1.
źródło
http://i64.tinypic.com/2qjybh4.png
http://i63.tinypic.com/flzwus.png
http://i63.tinypic.com/112g5fm.png
źródło