CameraUpdate
Sı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 Map
nesnenin 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 northeast
için eşit özellik southwest
, bu kapsadığı toprak alanının kısım, yani bounds
tam olarak sıfırdır. (Tek bir işaretçinin alanı olmadığı için bu mantıklıdır.)
- Size geçerek
bounds
, CameraUpdateFactory.newLatLngBounds
esasen 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
Map
nesne bu değeri desteklemediğinden, verilen konum için izin verilen daha makul bir maksimum düzeye kenetlenir.
Başka bir deyişle: Map
nesne 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, markers
yalnı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.