Anda harus menggunakan CameraUpdatekelas 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 Mapobjek yang telah melewati proses tata letak. Anda bisa menunggu ini terjadi menggunakan addOnGlobalLayoutListenerkonstruk. Detail dapat ditemukan dalam komentar untuk jawaban ini dan sisa jawaban. Anda juga dapat menemukan kode lengkap untuk mengatur tingkat peta menggunakan di addOnGlobalLayoutListenersini .
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 boundsvirtual akan memiliki northeastproperti sama dengan southwest, yang berarti bahwa porsi area bumi yang dicakup oleh ini boundspersis nol. (Ini logis karena satu penanda tidak memiliki area.)
- Dengan memberikan
boundskepada CameraUpdateFactory.newLatLngBoundsAnda 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,
Mapobjek tidak mendukung nilai ini sehingga dijepit ke tingkat maksimum yang lebih masuk akal yang diizinkan untuk lokasi tertentu.
Cara lain untuk menjelaskannya: bagaimana Mapobjek 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 markershanya 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.