Anda harus menggunakan CameraUpdate
kelas untuk melakukan (mungkin) semua gerakan peta terprogram.
Untuk melakukan ini, pertama hitung batas-batas semua penanda seperti:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Kemudian dapatkan objek deskripsi gerakan dengan menggunakan pabrik CameraUpdateFactory
::
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Akhirnya pindahkan peta:
googleMap.moveCamera(cu);
Atau jika Anda menginginkan animasi:
googleMap.animateCamera(cu);
Itu saja :)
Klarifikasi 1
Hampir semua metode gerakan membutuhkan Map
objek yang telah melewati proses tata letak. Anda bisa menunggu ini terjadi menggunakan addOnGlobalLayoutListener
konstruk. Detail dapat ditemukan dalam komentar untuk jawaban ini dan sisa jawaban. Anda juga dapat menemukan kode lengkap untuk mengatur tingkat peta menggunakan di addOnGlobalLayoutListener
sini .
Klarifikasi 2
Satu komentar mencatat bahwa menggunakan metode ini hanya untuk satu penanda menghasilkan zoom peta yang diatur ke tingkat zoom "aneh" (yang saya yakini sebagai tingkat zoom maksimum yang tersedia untuk lokasi tertentu). Saya pikir ini diharapkan karena:
- Mesin
LatLngBounds bounds
virtual akan memiliki northeast
properti sama dengan southwest
, yang berarti bahwa porsi area bumi yang dicakup oleh ini bounds
persis nol. (Ini logis karena satu penanda tidak memiliki area.)
- Dengan memberikan
bounds
kepada CameraUpdateFactory.newLatLngBounds
Anda pada dasarnya meminta perhitungan tingkat zoom sedemikian rupa sehingga bounds
(memiliki area nol) akan mencakup seluruh tampilan peta.
- Anda sebenarnya dapat melakukan perhitungan ini pada selembar kertas. Level pembesaran teoritis yang jawabannya adalah + ∞ (positif tak terhingga). Dalam praktiknya,
Map
objek tidak mendukung nilai ini sehingga dijepit ke tingkat maksimum yang lebih masuk akal yang diizinkan untuk lokasi tertentu.
Cara lain untuk menjelaskannya: bagaimana Map
objek dapat mengetahui level zoom apa yang harus dipilih untuk satu lokasi ? Mungkin nilai optimal harus 20 (jika itu mewakili alamat tertentu). Atau mungkin 11 (jika itu mewakili kota). Atau mungkin 6 (jika itu mewakili negara). API tidak sepintar itu dan keputusannya terserah Anda.
Jadi, Anda cukup memeriksa apakah markers
hanya memiliki satu lokasi dan jika demikian, gunakan salah satu dari:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- pergi ke posisi marker, biarkan level zoom saat ini utuh.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- pergi ke posisi marker, atur level zoom ke nilai yang dipilih secara sewenang-wenang 12.
addOnGlobalLayoutListener()
ataupost()
dengan yang sesuaiRunnable
. Inilah alasan mengapa koordinat layar penanda tidak dapat dilakukanonCreate
- lihat stackoverflow.com/q/14429877/1820695 Namun Anda dapat menggunakan beberapa metode bahkan sebelum tata letak terjadi - misalnya.CameraUpdateFactory.newLatLngBounds()
dengan 4 params .Google Map V2
Solusi berikut ini berfungsi untuk Android Marshmallow 6 (API 23, API 24, API 25, API 26, API 27, API 28). Ini juga berfungsi di Xamarin.
sumber
Begitu
misalnya, Google Map Anda ada di dalam RelativeLayout:
sumber
Saya tidak bisa menggunakan onGlobalLayoutlistener, jadi di sini ada solusi lain untuk mencegah
"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."
kesalahan:sumber
Dari kode ini, saya menampilkan beberapa penanda dengan zoom khusus pada layar peta.
// Variabel yang dideklarasikan
// Metode untuk menambahkan beberapa titik penanda dengan ikon yang dapat digambar
// Untuk menambahkan beberapa penanda yang terlihat di peta
sumber
Catatan - Ini bukan solusi untuk pertanyaan awal. Ini adalah solusi untuk salah satu submasalah yang dibahas di atas .
Solusi untuk @andr Klarifikasi 2 -
Ini benar-benar bermasalah ketika hanya ada satu penanda di batas dan karenanya tingkat zoom diatur ke tingkat yang sangat tinggi ( level 21 ). Dan Google tidak menyediakan cara untuk mengatur tingkat zoom maks pada saat ini. Ini juga bisa terjadi ketika ada lebih dari 1 penanda tetapi semuanya cukup dekat satu sama lain. Kemudian masalah yang sama akan terjadi.
Solusi - Misalkan Anda ingin Peta Anda tidak pernah melampaui tingkat zoom 16. Lalu setelah melakukan -
Periksa apakah level zoom Anda telah melewati level 16 (atau apa pun yang Anda inginkan) -
Dan jika level ini lebih besar dari 16, yang hanya akan terjadi jika ada marka yang sangat sedikit atau semua marka sangat dekat satu sama lain, maka perkecil peta Anda pada posisi tertentu hanya dengan mengatur level zoom ke 16.
Dengan cara ini Anda tidak akan pernah memiliki masalah tingkat zoom "aneh" yang dijelaskan dengan sangat baik oleh @andr juga.
sumber
ini akan membantu .. dari demo google apis
untuk info lebih jelas lihat url ini. https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java
sumber
Saya memiliki masalah yang sama, menggunakan kode berikut memecahkan masalah:
CameraUpdateFactory.newLatLngBounds(bounds, 200, 200, 5)
umumnya perbedaan lokasi dalam kasus saya tidak lebih dari dua kota tetangga.tampilannya agar sesuai dengan semua penanda di peta google maps v2
sumber
Tampilkan Semua Penanda dengan peta Google
Dalam Metode ini, simpan semua Penanda dan perbesar secara otomatis untuk menampilkan semua penanda di google map.
sumber
Gunakan metode "getCenterCoordinate" untuk mendapatkan koordinat pusat dan digunakan di CameraPosition.
sumber
Saya punya satu cara lain untuk melakukan hal yang sama ini bekerja dengan sempurna. jadi ide di belakang untuk menunjukkan semua spidol di layar kita membutuhkan pusat lat panjang dan tingkat zoom. di sini adalah fungsi yang akan memberi Anda berdua dan membutuhkan objek Latlng semua penanda sebagai input.
Fungsi ini mengembalikan objek Pair yang dapat Anda gunakan sukai
Anda bisa daripada menggunakan pelapis untuk menjauhkan spidol dari batas layar, Anda dapat menyesuaikan zoom dengan -1.
sumber
http://i64.tinypic.com/2qjybh4.png
http://i63.tinypic.com/flzwus.png
http://i63.tinypic.com/112g5fm.png
sumber