Android için Haritalar SDK'sındaki haritalar kolay hareketlerle yatırılıp döndürülebilir. Bu sayede, kullanıcılar haritayı kendileri için uygun bir yöne göre ayarlayabilir. Tüm yakınlaştırma düzeylerinde, haritayı kaydırabilir veya vektör tabanlı harita döşemelerinin daha küçük kapladığı alan sayesinde, çok az gecikmeyle perspektifini değiştirebilirsiniz.
Kod örnekleri
GitHub'daki ApiDemos deposu, kamera özelliklerini gösteren bir örnek içerir:
- KameraDemoActivity - Kotlin: Kamera konumunu değiştirme
- KameraDemoActivity - Java: Kamera konumunu değiştirme
Giriş
Web'deki Google Haritalar gibi Google Haritalar SDK'sı da Mercator projeksiyonu kullanarak cihazınızın ekranındaki dünya yüzeyini (bir küre) gösterir. Dünya kendi etrafında kesintisiz bir şekilde gezinirken, doğu ve batı yönünde harita sonsuza kadar tekrarlanır. Kuzey ve güneyde harita yaklaşık 85 derece kuzey ve 85 derece güney yönünde sınırlandırılmıştır.
Not: Merkatör projeksiyonu, boylamsal olarak sınırlı genişliğe ancak yatay olarak sonsuz yüksekliğe sahiptir. Ortaya çıkan harita şeklini kare yapmak için Merkatör projeksiyonunu kullanarak temel harita görüntülerini yaklaşık +/- 85 derecede "kestik". Bu sayede karo seçiminde mantığı daha rahat kullandık.
Android için Haritalar SDK'sı, haritanın kamerasını değiştirerek kullanıcının haritaya bakış açısını değiştirmenize olanak tanır.
Kamerada yapılan değişiklikler, eklediğiniz işaretçiler, yer paylaşımları veya diğer grafiklerde herhangi bir değişiklik yapmaz. Ancak, eklemelerinizi yeni görünüme daha uygun olacak şekilde değiştirmek isteyebilirsiniz.
Haritada kullanıcı hareketlerini dinleyebildiğinizden, haritayı kullanıcı isteklerine göre değiştirebilirsiniz. Örneğin, geri çağırma yöntemi OnMapClickListener.onMapClick()
, haritaya bir kez dokunmaya yanıt verir. Yöntem, dokunma konumunun enlem ve boylamını aldığından, bu noktaya kaydırarak veya yakınlaştırarak yanıt verebilirsiniz.
İşaretçi balonuna dokunmalara yanıt vermek veya
işaretçi üzerindeki sürükleme hareketine yanıt vermek için de benzer yöntemler kullanılabilir.
Ayrıca kamera hareketlerini de dinleyebilirsiniz. Böylece, kamera hareket etmeye başladığında, o anda hareket ettiğinde veya hareket etmeyi durdurduğunda uygulamanızın bir bildirim alması gerekir. Ayrıntılar için kamera değişikliği etkinlikleri kılavuzuna bakın.
Kamera konumu
Harita görünümü, düz bir düzlemde aşağıya bakan bir kamera gibi modellenmiştir. Kameranın konumu (ve dolayısıyla haritanın oluşturulması) şu özelliklerle belirlenir: target (enlem/boylam konumu), bearing, tilt ve zoom.
Hedef (yer)
Kamera hedefi, enlem ve boylam koordinatları olarak belirtilen harita merkezinin konumudur.
Enlem, -85 ile 85 derece (bu değerler dahil) arasında olabilir. Bu aralığın üzerindeki veya altındaki değerler, aralık içindeki en yakın değere ayarlanır. Örneğin, enlemi 100 olarak ayarladığınızda değer 85 olarak ayarlanır. Boylam -180 ile 180 derece (bu değerler dahil) aralığındadır. Bu aralığın üzerindeki veya altındaki değerler, aralıkta (-180, 180) yer alacak şekilde sarmalanır. Örneğin, 480, 840 ve 1200 değerlerinin tamamı 120 dereceye ayarlanır.Yönlendirme (yön)
Kamera yönü, haritanın üst kenarına karşılık gelen, gerçek kuzeyden derece cinsinden ölçülen pusula yönünü belirtir. Haritanın merkezinden haritanın üst kenarına dikey bir çizgi çizerseniz, yön, kameranın gerçek kuzey yönüne göre (derece cinsinden ölçülür) yönüne karşılık gelir.
Başlangıç noktası 0, haritanın üst kısmının gerçek kuzeyi gösterdiği anlamına gelir. Bitiş değeri 90, haritanın üst tarafı doğudan gelecek (pusulada 90 derece) anlamına gelir. 180 değeri, haritanın üst kısmı güneyde bulunan noktadır.
Google Haritalar API'sı bir haritanın yönünü değiştirmenize olanak tanır. Örneğin, araba kullanan bir kişi, seyahat yönüyle hizalamak için genellikle yol haritasını döndürürken, harita ve pusula kullanan yürüyüşçüler genellikle haritayı, dikey bir çizgi kuzeyi gösterecek şekilde yönlendirir.
Yatır (görüntüleme açısı)
Eğme, bir yay üzerinde kameranın konumunu doğrudan haritanın merkez konumu üzerinde tanımlar. Bu konum, nadirden (kameranın doğrudan altını gösteren yön) derece cinsinden ölçülür. 0 değeri, doğrudan aşağı doğru gösterilen kameraya karşılık gelir. 0'dan büyük değerler, belirtilen derece sayısı ile ufka doğru eğimli bir kameraya karşılık gelir. Görüntüleme açısını değiştirdiğinizde, harita perspektifte, uzaktaki özellikler daha küçük, yakındaki özellikler ise daha büyük görünür. Aşağıdaki resimlerde bu durum gösterilmektedir.
Aşağıdaki resimlerde görüntüleme açısı 0 derecedir. İlk resimde bunun bir şeması bulunmaktadır. 1. kamera konumu, 2. konum ise mevcut harita konumudur. Oluşturulan harita onun altında gösterilir.
Aşağıdaki resimlerde görüntüleme açısı 45 derecedir. Kameranın 3. konuma gelecek şekilde, düz yukarıdan (0 derece) ve zemin (90 derece) arasında bir yay boyunca yarıya doğru hareket ettiğine dikkat edin. Kamera hâlâ haritanın merkez noktasını gösteriyor, ancak 4 konumundaki çizgiyle temsil edilen alan artık görünüyor.
Bu ekran görüntüsündeki harita hâlâ orijinal haritadakiyle aynı noktanın ortasındadır, ancak haritanın üst kısmında daha fazla özellik görünmektedir. Açıyı 45 dereceden fazla artırdığınızda kamera ile harita konumu arasındaki özellikler orantılı olarak daha büyük görünürken harita konumu dışındaki özellikler de orantılı olarak daha küçük görünür ve üç boyutlu bir etki elde eder.
Tarih aralığını
Kameranın yakınlaştırma düzeyi, haritanın ölçeğini belirler. Daha büyük yakınlaştırma düzeylerinde ekranda daha fazla ayrıntı, daha düşük zum düzeylerinde ise ekranda dünyanın daha fazla kısmı görülebilir. 0. yakınlaştırma düzeyinde haritanın ölçeği, tüm dünyanın yaklaşık 256 dp genişliğe sahip olacağı şekildedir (yoğunluktan bağımsız pikseller).
Yakınlaştırma düzeyini 1 artırmak, ekrandaki dünyanın genişliğini iki katına çıkarır. Bu nedenle, N yakınlaştırma düzeyinde dünyanın genişliği yaklaşık 256 x 2N dp'dir. Örneğin, yakınlaştırma düzeyi 2'de tüm dünya yaklaşık 1024 dp genişliğindedir.
Yakınlaştırma düzeyinin tam sayı olması gerekmez. Haritanın izin verdiği yakınlaştırma seviyeleri; hedef, harita türü ve ekran boyutu gibi çeşitli faktörlere bağlıdır. Aralığın dışındaki herhangi bir sayı, en yakın geçerli değere dönüştürülür. Bu değer, minimum veya maksimum yakınlaştırma düzeyi olabilir. Aşağıdaki listede, her bir yakınlaştırma düzeyinde görmeyi bekleyebileceğiniz yaklaşık ayrıntı düzeyi gösterilmektedir:
- 1: Dünya
- 5: Karalar/kıta
- 10: Şehir
- 15: Sokaklar
- 20: Binalar
Kamerayı hareket ettirme
Google Haritalar API'si, haritada dünyanın hangi bölümünün görüneceğini değiştirmenize olanak tanır. Bu, haritayı hareket ettirmek yerine kameranın konumunu değiştirerek gerçekleştirilir.
Kamerayı değiştirdiğinizde, oluşan kamera hareketini animasyon etme seçeneğiniz vardır. Animasyon, mevcut kamera özellikleri ile yeni kamera özellikleri arasında interpolasyon yapar. Animasyonun süresini de kontrol edebilirsiniz.
Kameranın konumunu değiştirmek için CameraUpdate
kullanarak kamerayı hareket ettirmek istediğiniz yeri belirtmeniz gerekir. Maps API, CameraUpdateFactory
kullanarak birçok farklı türde CameraUpdate
oluşturmanıza olanak tanır. Aşağıdaki seçenekler kullanılabilir:
Yakınlaştırma düzeyini değiştirme ve minimum/maksimum yakınlaştırmayı ayarlama
CameraUpdateFactory.zoomIn()
ve
CameraUpdateFactory.zoomOut()
, diğer tüm özellikleri aynı tutarken yakınlaştırma düzeyini 1,0 değiştiren bir CameraUpdate
verir.
CameraUpdateFactory.zoomTo(float)
, yakınlaştırma düzeyini verilen değerle değiştirirken diğer tüm özellikleri aynı tutan bir CameraUpdate
sağlar.
CameraUpdateFactory.zoomBy(float)
ve CameraUpdateFactory.zoomBy(float, Point)
, yakınlaştırma düzeyini belirtilen değere göre artıran (veya değer negatifse azaltan) bir CameraUpdate
verir. İkincisi ise ekrandaki belirtilen noktayı, aynı konumda (enlem/boylam) kalacak şekilde sabitler ve bunu yapabilmek için kameranın konumunu değiştirebilir.
Tercih ettiğiniz bir minimum ve/veya maksimum yakınlaştırma düzeyini ayarlamak size yardımcı olabilir. Örneğin, uygulamanız bir önemli yerin çevresinde tanımlı bir alan gösteriyorsa veya sınırlı sayıda yakınlaştırma düzeyine sahip özel bir karo yer paylaşımı kullanıyorsanız bu, kullanıcı deneyimini kontrol etmek açısından faydalıdır.
Kotlin
private lateinit var map: GoogleMap map.setMinZoomPreference(6.0f) map.setMaxZoomPreference(14.0f)
Java
private GoogleMap map; map.setMinZoomPreference(6.0f); map.setMaxZoomPreference(14.0f);
API'nin, kullanıcıların çok düşük veya çok yüksek yakınlaştırma yapmasına izin vermesini engelleyebilecek teknik hususlar bulunduğunu unutmayın. Örneğin, uydu veya arazi, temel harita parçalarından daha düşük bir maksimum yakınlaştırma değerine sahip olabilir.
Kameranın konumunu değiştirme
Sık karşılaşılan konum değişiklikleri için iki kolay yöntem vardır.
CameraUpdateFactory.newLatLng(LatLng)
, diğer tüm özellikleri korurken kameranın enlem ve boylamını değiştiren bir CameraUpdate
sağlar.
CameraUpdateFactory.newLatLngZoom(LatLng, float)
, kameranın enlem, boylam ve yakınlaştırma ayarlarını değiştirirken diğer tüm özellikleri koruyan bir CameraUpdate
sağlar.
Kamera konumunu değiştirirken tam esneklik için CameraUpdateFactory.newCameraPosition(CameraPosition)
kullanın. Bu ayar, kamerayı belirtilen konuma hareket ettiren bir CameraUpdate
olanağı sağlar. CameraPosition
, doğrudan new CameraPosition()
kullanılarak veya new CameraPosition.Builder()
kullanılarak bir CameraPosition.Builder
ile elde edilebilir.
Kaydırma (kaydırma)
CameraUpdateFactory.scrollBy(float, float)
, kameranın enlem ve boylamını harita belirtilen piksel sayısı kadar hareket edecek şekilde değiştiren bir CameraUpdate
sağlar. Pozitif bir x değeri, kameranın sağa doğru hareket etmesine neden olarak harita sola gitmiş gibi görünür. Pozitif bir y değeri, kameranın aşağı hareket etmesine neden olarak harita yukarı çıkmış gibi görünür. Buna karşılık, negatif x değerleri kameranın sola hareket etmesine neden olur. Dolayısıyla, harita sağa ve negatif y değerleri hareket etmiş gibi görünür. Bu durum, kameranın yukarı hareket etmesine neden olur. Kaydırma, kameranın mevcut yönüne göredir. Örneğin, kameranın yönü 90 dereceyse doğu yönü "yukarı"dır.
Sınır belirleme
Haritanın sınırlarını belirleme
Bazen kamerayı, ilgilenilen alanın tamamı mümkün olan en büyük yakınlaştırma düzeyinde görünecek şekilde
harekete geçirmek yararlı olur. Örneğin, kullanıcının mevcut konumundan 5 km mesafedeki tüm benzin istasyonlarını görüntülüyorsanız kamerayı, tümü ekranda görünecek şekilde hareket ettirmek isteyebilirsiniz. Bunu yapmak için önce ekranda görünmesini istediğiniz LatLngBounds
değerini hesaplayın. Ardından, belirtilen LatLngBounds
öğesi haritaya tamamen uyacak şekilde, belirtilen dolguyu (piksel cinsinden) hesaba katarak kamera konumunu değiştiren bir CameraUpdate
elde etmek için CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int
padding)
kullanabilirsiniz. Döndürülen CameraUpdate
, belirtilen sınırlar ile haritanın kenarı arasındaki boşluğun (piksel cinsinden) en az belirtilen dolgu kadar olmasını sağlar. Haritanın yatırma ve açısının
0 olacağını unutmayın.
Kotlin
val australiaBounds = LatLngBounds( LatLng((-44.0), 113.0), // SW bounds LatLng((-10.0), 154.0) // NE bounds ) map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0))
Java
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngBounds(australiaBounds, 0));
Haritayı bir alan dahilinde ortalama
Bazı durumlarda, kameranızı aşırı kenarlıkları eklemek yerine bir sınırlar içinde ortalamak isteyebilirsiniz. Örneğin, kamerayı bir ülkenin merkezine
sabit yakınlaştırmak için kullanabilirsiniz. Bu durumda, LatLngBounds
oluşturup LatLngBounds
ile CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom)
kullanarak benzer bir yöntem kullanabilirsiniz.getCenter()
yöntemini çağırın. getCenter() yöntemi, LatLngBounds
coğrafi merkezini döndürür.
Kotlin
val australiaBounds = LatLngBounds( LatLng((-44.0), 113.0), // SW bounds LatLng((-10.0), 154.0) // NE bounds ) map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.center, 10f))
Java
LatLngBounds australiaBounds = new LatLngBounds( new LatLng(-44, 113), // SW bounds new LatLng(-10, 154) // NE bounds ); map.moveCamera(CameraUpdateFactory.newLatLngZoom(australiaBounds.getCenter(), 10));
newLatLngBounds(boundary, width, height,
padding)
yönteminin aşırı yüklenmesi, dikdörtgen için genişliği ve yüksekliği piksel cinsinden belirtmenize olanak tanır.
Bunların, haritanın boyutlarına karşılık gelmesi amaçlanır. Dikdörtgen, harita görünümünün merkeziyle aynı olacak şekilde yerleştirilir (böylece, belirtilen boyutlar harita görünümünün boyutlarıyla aynıysa dikdörtgen harita görünümüyle çakışır). Döndürülen CameraUpdate
değeri, kamerayı gereken dolguyu hesaba katarak mümkün olan en geniş yakınlaştırma düzeyinde belirtilen LatLngBounds
dikdörtgen içinde ekranın ortasına gelecek şekilde hareket ettirir.
Not: Harita düzenlendikten sonra kamerayı hareket ettirmek için kullanılacaksa CameraUpdate
oluşturmak için yalnızca daha basit bir yöntem olan newLatLngBounds(boundary, padding)
yöntemini kullanın. Düzen sırasında API, sınırlayıcı kutuyu doğru şekilde yansıtmak için gereken haritanın görüntüleme sınırlarını hesaplar. Buna karşılık, API görüntüleme sınırlarını aktardığınız bağımsız değişkenlere göre hesapladığı için, daha karmaşık bir yöntem olan newLatLngBounds(boundary, width, height, padding)
tarafından döndürülen CameraUpdate
yöntemini istediğiniz zaman, harita düzenlenmeden önce bile kullanabilirsiniz.
Kullanıcının kaydırma işlevini belirli bir alanla sınırlama
Yukarıdaki senaryolarda, haritanın sınırlarını ayarlarsınız ancak kullanıcı daha sonra bu sınırların dışına kaydırabilir veya yatay kaydırabilir. Bunun yerine, kullanıcıların yalnızca bu sınırlar dahilinde kaydırma ve yatay kaydırma yapabilmesi için haritanın odak noktasının (kamera hedefi) enlem/boylam merkez sınırlarını sınırlamak isteyebilirsiniz. Örneğin, bir alışveriş merkezine veya havaalanına ait bir perakende uygulaması, haritayı belirli bir sınırlarla sınırlamak ve böylece kullanıcıların bu sınırlar içinde kaydırmak için uygun olmasını isteyebilir.
Kotlin
// Create a LatLngBounds that includes the city of Adelaide in Australia. val adelaideBounds = LatLngBounds( LatLng(-35.0, 138.58), // SW bounds LatLng(-34.9, 138.61) // NE bounds ) // Constrain the camera target to the Adelaide bounds. map.setLatLngBoundsForCameraTarget(adelaideBounds)
Java
// Create a LatLngBounds that includes the city of Adelaide in Australia. LatLngBounds adelaideBounds = new LatLngBounds( new LatLng(-35.0, 138.58), // SW bounds new LatLng(-34.9, 138.61) // NE bounds ); // Constrain the camera target to the Adelaide bounds. map.setLatLngBoundsForCameraTarget(adelaideBounds);
Aşağıdaki şemada, kamera hedefinin görüntü alanından biraz daha büyük bir alanla sınırlandırıldığı bir senaryo gösterilmektedir. Kullanıcı, kamera hedefinin sınırlı alan içinde kalması şartıyla ekranı kaydırıp kaydırabilir. Artı işareti, kamera hedefini temsil eder:
Harita, görüntü alanının tanımlanan sınırların dışında kalan alanları göstermesine neden olsa bile, görüntü alanını her zaman doldurur. Örneğin, kamera hedefini sınırlı alanın bir köşesine konumlandırırsanız köşenin ötesindeki alan görüntü alanında görünür, ancak kullanıcılar bu alanın içine daha fazla kaydıramaz. Aşağıdaki şemada bu senaryo gösterilmektedir. Artı işareti, kamera hedefini temsil eder:
Aşağıdaki şemada, kamera hedefinin sınırları son derece kısıtlıdır ve bu da kullanıcıya haritayı kaydırmak veya kaydırmak için çok az fırsat sunmaktadır. Artı işareti, kamera hedefini temsil eder:
Kamera görünümü güncelleniyor
Haritaya bir CameraUpdate
uygulamak için kamerayı anında hareket ettirebilir veya kameraya yumuşak bir animasyon uygulayabilirsiniz. Belirtilen CameraUpdate
ile kamerayı anında hareket ettirmek için GoogleMap.moveCamera(CameraUpdate)
numaralı telefonu arayabilirsiniz.
Değişimi canlandırarak, özellikle kısa hareketlerde
kullanıcı deneyimini daha keyifli hale getirebilirsiniz. Bunu yapmak için GoogleMap.moveCamera
yerine GoogleMap.animateCamera
numaralı telefonu arayın.
Harita sorunsuz şekilde yeni özelliklere taşınır. Bu yöntemin en ayrıntılı biçimi olan GoogleMap.animateCamera(cameraUpdate, duration, callback)
üç bağımsız değişken sunar:
cameraUpdate
- Kamerayı nereye taşıyacağınızı açıklayan
CameraUpdate
. callback
GoogleMap.CancellableCallback
uygulayan bir nesne. Görevlerin işlenmesine yönelik bu genelleştirilmiş arayüz, "onCancel()" ve "onFinished()" iki yöntemini tanımlar. Animasyon için yöntemler aşağıdaki durumlarda çağrılır:onFinish()
- Animasyon kesintiye uğramadan tamamlanırsa çağrılır.
onCancel()
-
Animasyon,
stopAnimation()
çağrısı yapılarak veya yeni bir kamera hareketi başlatılarak kesilirse çağrılır.Alternatif olarak,
GoogleMap.stopAnimation()
yöntemini çağırdığınızda da bu durumla karşılaşabilirsiniz.
duration
int
olarak animasyonun istenen süresi (milisaniye cinsinden).
Aşağıdaki kod snippet'lerinde, kamerayı hareket ettirmenin yaygın yöntemlerinden bazıları gösterilmektedir.
Kotlin
val sydney = LatLng(-33.88, 151.21) val mountainView = LatLng(37.4, -122.1) // Move the camera instantly to Sydney with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15f)) // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomIn()) // Zoom out to zoom level 10, animating with a duration of 2 seconds. map.animateCamera(CameraUpdateFactory.zoomTo(10f), 2000, null) // Construct a CameraPosition focusing on Mountain View and animate the camera to that position. val cameraPosition = CameraPosition.Builder() .target(mountainView) // Sets the center of the map to Mountain View .zoom(17f) // Sets the zoom .bearing(90f) // Sets the orientation of the camera to east .tilt(30f) // Sets the tilt of the camera to 30 degrees .build() // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
Java
LatLng sydney = new LatLng(-33.88,151.21); LatLng mountainView = new LatLng(37.4, -122.1); // Move the camera instantly to Sydney with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomIn()); // Zoom out to zoom level 10, animating with a duration of 2 seconds. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); // Construct a CameraPosition focusing on Mountain View and animate the camera to that position. CameraPosition cameraPosition = new CameraPosition.Builder() .target(mountainView ) // Sets the center of the map to Mountain View .zoom(17) // Sets the zoom .bearing(90) // Sets the orientation of the camera to east .tilt(30) // Sets the tilt of the camera to 30 degrees .build(); // Creates a CameraPosition from the builder map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));