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.