CameraUpdateSınıfı, tüm programlı harita hareketlerini (muhtemelen) yapmak için kullanmalısınız .
Bunu yapmak için, önce tüm işaretçilerin sınırlarını şu şekilde hesaplayın:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Ardından fabrikayı kullanarak bir hareket tanımı nesnesi edinin CameraUpdateFactory:
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Son olarak haritayı taşıyın:
googleMap.moveCamera(cu);
Veya bir animasyon istiyorsanız:
googleMap.animateCamera(cu);
Bu kadar :)
Açıklama 1
Hemen hemen tüm hareket yöntemleri Mapnesnenin mizanpaj sürecini geçmesini gerektirir . Yapıyı kullanarak bunun olmasını bekleyebilirsiniz addOnGlobalLayoutListener. Ayrıntılar bu yanıtın yorumlarında ve kalan yanıtlarda bulunabilir. Burada kullanarak harita kapsamını ayarlamak için tam bir kodaddOnGlobalLayoutListener da bulabilirsiniz .
Açıklama 2
Bir yorum, bu yöntemi yalnızca bir işaretçi için kullanmanın harita yakınlaştırmasının "tuhaf" yakınlaştırma düzeyine ayarlandığını (belirli bir konum için kullanılabilir maksimum yakınlaştırma düzeyi olduğuna inanıyorum) not eder. Bunun beklendiğini düşünüyorum çünkü:
LatLngBounds boundsÖrnek olacak northeastiçin eşit özellik southwest, bu kapsadığı toprak alanının kısım, yani boundstam olarak sıfırdır. (Tek bir işaretçinin alanı olmadığı için bu mantıklıdır.)
- Size geçerek
bounds, CameraUpdateFactory.newLatLngBoundsesasen bounds(sıfır alana sahip) tüm harita görünümünü kapsayacak bir yakınlaştırma seviyesinin hesaplanmasını talep edersiniz .
- Bu hesaplamayı aslında bir kağıt üzerinde yapabilirsiniz. Yanıtın teorik zoom seviyesi + ∞ (pozitif sonsuzluk) 'dur. Pratikte
Mapnesne bu değeri desteklemediğinden, verilen konum için izin verilen daha makul bir maksimum düzeye kenetlenir.
Başka bir deyişle: Mapnesne tek bir konum için hangi zum düzeyini seçmesi gerektiğini nasıl bilebilir ? Belki de optimal değer 20 olmalıdır (belirli bir adresi temsil ediyorsa). Ya da belki 11 (bir kasabayı temsil ediyorsa). Ya da belki 6 (bir ülkeyi temsil ediyorsa). API o kadar akıllı değil ve karar size kalmış.
Bu nedenle, markersyalnızca bir konumun olup olmadığını kontrol etmelisiniz ve eğer öyleyse aşağıdakilerden birini kullanın:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition()) - işaretleyici konumuna gidin, geçerli zoom seviyesini olduğu gibi bırakın.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F) - işaretleyici konumuna gidin, zoom seviyesini keyfi olarak seçilen değere ayarlayın 12.