Android için Haritalar SDK'sındaki haritalar, basit hareketlerle eğilebilir ve döndürülebilir. Bu sayede kullanıcılar, haritayı kendileri için anlamlı bir yöne ayarlayabilir. Vektör tabanlı harita karolarının daha küçük ayak izi sayesinde, herhangi bir yakınlaştırma seviyesinde haritayı kaydırabilir veya çok az gecikmeyle perspektifini değiştirebilirsiniz.
Kod örnekleri
GitHub'daki ApiDemos deposunda, kamera özelliklerini gösteren bir örnek bulunur:
- CameraDemoActivity - Kotlin: Kamera konumunu değiştirme
- CameraDemoActivity - Java: Kamera konumunu değiştirme
Giriş
Web'deki Google Haritalar gibi, Android için Haritalar SDK'sı da Mercator projeksiyonunu kullanarak cihazınızın ekranında (düz bir düzlem) dünyanın yüzeyini (bir küre) gösterir. Doğu ve batı yönünde harita, dünya kendi etrafında kesintisiz bir şekilde döndüğü için sonsuz olarak tekrarlanır. Harita, kuzey ve güney yönünde yaklaşık 85 derece kuzey ve 85 derece güney ile sınırlıdır.
Not: Mercator projeksiyonunun boylam olarak sınırlı bir genişliği, enlem olarak ise sınırsız bir yüksekliği vardır. Mercator projeksiyonunu kullanan temel harita görüntülerini yaklaşık +/- 85 derecede "keserek" haritayı kare şekline getiririz. Bu sayede karo seçimi için daha kolay bir mantık elde edilir.
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şaretlerde, yer paylaşımlarında veya diğer grafiklerde herhangi bir değişikliğe neden olmaz. Ancak eklemelerinizi yeni görünüme daha iyi uyacak şekilde değiştirmek isteyebilirsiniz.
Kullanıcıların haritadaki hareketlerini dinleyebildiğiniz için haritayı kullanıcı isteklerine göre değiştirebilirsiniz. Örneğin, geri çağırma yöntemi OnMapClickListener.onMapClick(), haritaya tek 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 dokunma veya işaretçiyi sürükleme hareketlerine yanıt vermek için benzer yöntemler kullanılabilir.
Kamera hareketlerini de dinleyebilirsiniz. Böylece uygulamanız, kamera hareket etmeye başladığında, hareket halindeyken veya hareket etmeyi durdurduğunda bildirim alır. Ayrıntılı bilgi için kamera değişikliği etkinlikleri kılavuzuna bakın.
Kamera konumu
Harita görünümü, düz bir düzleme bakan bir kamera olarak modellenir. Kameranın konumu (ve dolayısıyla haritanın oluşturulması) şu özelliklerle belirtilir: hedef (enlem/boylam konumu), kerteriz, eğim ve yakınlaştırma.
Hedef (konum)
Kamera hedefi, haritanın merkezinin konumudur ve enlem ve boylam koordinatları olarak belirtilir.
Enlem, -85 ile 85 derece arasında (bu değerler dahil) olabilir. Bu aralığın üstündeki veya altındaki değerler, bu aralıktaki en yakın değere sabitlenir. Örneğin, 100 enlem değeri belirtildiğinde değer 85 olarak ayarlanır. Boylam, -180 ile 180 derece (bu değerler dahil) arasında olmalıdır. Bu aralığın üstünde veya altında olan değerler, (-180, 180) aralığına sığacak şekilde sarmalanır. Örneğin, 480, 840 ve 1200 değerleri 120 dereceye sarılır.Yön (oryantasyon)
Kamera yönü, pusula yönünü belirtir. Bu yön, haritanın üst kenarına karşılık gelen, gerçek kuzeyden itibaren derece cinsinden ölçülür. Haritanın merkezinden üst kenarına dikey bir çizgi çizdiğinizde, kerteriz, kameranın gerçek kuzeye göre yönüne (derece cinsinden ölçülür) karşılık gelir.
0 yönü, haritanın üst kısmının gerçek kuzeyi gösterdiği anlamına gelir. 90 yön değeri, haritanın üst kısmının tam doğuyu (pusulada 90 derece) gösterdiği anlamına gelir. 180 değeri, haritanın üst kısmının güneyi gösterdiği anlamına gelir.
Maps API, haritanın yönünü değiştirmenize olanak tanır. Örneğin, araba kullanan bir kişi genellikle yol haritasını seyahat yönüne göre hizalarken harita ve pusula kullanan yürüyüşçüler genellikle haritayı dikey bir çizgi kuzeyi gösterecek şekilde yönlendirir.
Eğim (görüntüleme açısı)
Eğim, kameranın doğrudan haritanın merkez konumunun üzerindeki bir yay üzerindeki konumunu tanımlar. Bu konum, nadir (doğrudan kameranın altını gösteren yön) açısından derece cinsinden ölçülür. 0 değeri, doğrudan aşağıya bakan bir kameraya karşılık gelir. 0'dan büyük değerler, belirtilen derece sayısı kadar ufka doğru eğilmiş bir kameraya karşılık gelir. Görüntüleme açısını değiştirdiğinizde harita, uzaktaki özellikler daha küçük, yakındaki özellikler daha büyük görünecek şekilde perspektif olarak gösterilir. Aşağıdaki resimlerde bu durum gösterilmektedir.
Aşağıdaki resimlerde görüntüleme açısı 0 derecedir. İlk resimde bunun şeması gösterilmektedir. 1 konumu kamera konumu, 2 konumu ise mevcut harita konumudur. Elde edilen harita, istemin altında gösterilir.
|
|
Aşağıdaki resimlerde görüntüleme açısı 45 derecedir. Kameranın, tam tepeden (0 derece) yere (90 derece) doğru bir yayın yarısına kadar hareket ederek 3 konumuna geldiğini görebilirsiniz. Kamera hâlâ haritanın merkez noktasını gösteriyor ancak 4 konumundaki çizgiyle temsil edilen alan artık görünür durumda.
|
|
Bu ekran görüntüsündeki harita, orijinal haritadakiyle aynı noktaya odaklanmaya devam ediyor ancak haritanın üst kısmında daha fazla özellik gösteriliyor. Açıyı 45 derecenin üzerine çıkardığınızda, kamera ile harita konumu arasındaki özellikler orantılı olarak daha büyük görünürken harita konumunun ötesindeki özellikler orantılı olarak daha küçük görünür ve üç boyutlu bir efekt elde edilir.
Tarih aralığını
Kameranın yakınlaştırma seviyesi, haritanın ölçeğini belirler. Daha yüksek yakınlaştırma seviyelerinde ekranda daha fazla ayrıntı görülebilirken daha düşük yakınlaştırma seviyelerinde ekranda daha fazla yer görülebilir. 0 yakınlaştırma seviyesinde haritanın ölçeği, tüm dünyanın yaklaşık 256 dp (yoğunluktan bağımsız piksel) genişliğe sahip olacağı şekildedir.
Yakınlaştırma seviyesini 1 artırdığınızda, dünyadaki genişlik ekranda iki katına çıkar. Bu nedenle, N yakınlaştırma seviyesinde dünyanın genişliği yaklaşık olarak 256 * 2N dp'dir. Örneğin, 2. yakınlaştırma seviyesinde tüm dünya yaklaşık 1.024 dp genişliğindedir.
Yakınlaştırma seviyesi tam sayı olmak zorunda değildir. Haritanın izin verdiği yakınlaştırma düzeyleri, hedef, harita türü ve ekran boyutu gibi çeşitli faktörlere bağlıdır. Aralık dışındaki tüm sayılar, en yakın geçerli değere dönüştürülür. Bu değer, minimum yakınlaştırma seviyesi veya maksimum yakınlaştırma seviyesi olabilir. Aşağıdaki listede, her yakınlaştırma seviyesinde görmeyi bekleyebileceğiniz yaklaşık ayrıntı düzeyi gösterilmektedir:
- 1: Dünya
- 5: Kara parçası/kıta
- 10: Şehir
- 15: Sokaklar
- 20: Binalar
|
|
|
Kamerayı hareket ettirme
Haritalar API'si, haritada dünyanın hangi bölümünün görüneceğini değiştirmenize olanak tanır. Bu, kameranın konumunu değiştirerek (haritayı hareket ettirmek yerine) gerçekleştirilir.
Kamerayı değiştirdiğinizde ortaya çıkan kamera hareketini animasyonla gösterebilirsiniz. Animasyon, mevcut kamera özellikleri ile yeni kamera özellikleri arasında enterpolasyon yapar. Animasyonun süresini de kontrol edebilirsiniz.
Kameranın konumunu değiştirmek için CameraUpdate kullanarak kamerayı taşımak 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 seviyesini 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 seviyesini 1,0 oranında değiştiren bir CameraUpdate döndürür.
CameraUpdateFactory.zoomTo(float),
diğer tüm özellikleri aynı tutarken yakınlaştırma seviyesini verilen değere değiştiren bir CameraUpdate döndürür.
CameraUpdateFactory.zoomBy(float)
ve
CameraUpdateFactory.zoomBy(float, Point)
yakınlaştırma seviyesini belirtilen değer kadar artıran (veya değer negatifse azaltan) bir CameraUpdate döndürür. İkincisi, ekrandaki belirli bir noktayı aynı konumda (enlem/boylam) kalacak şekilde sabitler ve bunu yapmak için kameranın konumunu değiştirebilir.
Tercih edilen minimum ve/veya maksimum yakınlaştırma seviyesini ayarlamak yararlı olabilir. Örneğin, uygulamanız ilgi çekici bir yerin etrafında tanımlanmış bir alan gösteriyorsa veya sınırlı bir dizi yakınlaştırma seviyesiyle özel bir karo yerleşimi kullanıyorsanız bu özellik, kullanıcının deneyimini kontrol etmek için yararlıdır.
Kotlin
map.setMinZoomPreference(6.0f) map.setMaxZoomPreference(14.0f)
Java
map.setMinZoomPreference(6.0f); map.setMaxZoomPreference(14.0f);
API'nin, kullanıcıların çok fazla yakınlaştırmasını veya uzaklaştırmasını engelleyebilecek teknik hususlar olduğunu unutmayın. Örneğin, uydu veya arazi, temel harita parçalarına kıyasla daha düşük bir maksimum yakınlaştırma seviyesine sahip olabilir.
Kamera konumunu değiştirme
Ortak konum değişiklikleri için iki kolaylık yöntemi 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 enlemini, boylamını ve yakınlaştırmasını değiştiren,
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, kamerayı belirtilen konuma taşıyan bir CameraUpdate sağlar. CameraPosition, doğrudan new CameraPosition() kullanılarak veya CameraPosition.Builder ile new CameraPosition.Builder() kullanılarak elde edilebilir.
Kaydırma
CameraUpdateFactory.scrollBy(float, float), haritayı belirtilen piksel sayısı kadar hareket ettirecek şekilde kameranın enlem ve boylamını değiştiren bir CameraUpdate döndürür. Pozitif bir x değeri, kameranın sağa hareket etmesine neden olur. Bu durumda harita sola hareket etmiş gibi görünür. Pozitif bir y değeri, kameranın aşağı doğru hareket etmesine neden olur. Böylece harita yukarı doğru hareket etmiş gibi görünür. Buna karşılık, negatif x değerleri kameranın sola hareket etmesine neden olur. Böylece harita sağa hareket etmiş gibi görünür. Negatif y değerleri ise kameranın yukarı hareket etmesine neden olur. Kaydırma, kameranın mevcut yönüne göre yapılır. Örneğin, kameranın yönü 90 derece ise doğu "yukarı"dır.
Sınırları belirleme
Haritanın sınırlarını ayarlama
Bazen kamerayı, ilgi alanının tamamı mümkün olan en yüksek yakınlaştırma seviyesinde görünecek şekilde hareket ettirmek yararlı olur. Örneğin, kullanıcının mevcut konumuna beş mil mesafedeki tüm benzin istasyonlarını gösteriyorsanız kamerayı, hepsinin ekranda görüneceği şekilde hareket ettirmek isteyebilirsiniz. Bunun için öncelikle ekranda görünmesini istediğiniz LatLngBounds hesaplayın. Ardından, belirtilen dolguyu (piksel cinsinden) hesaba katarak, verilen LatLngBounds haritaya tamamen sığacak şekilde kamera konumunu değiştiren bir CameraUpdate elde etmek için CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int
padding) kullanabilirsiniz. Döndürülen CameraUpdate, verilen 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 eğiminin ve yönü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ın ortasına getirme
Bazı durumlarda, kameranızı uç sınırları dahil etmek yerine bir sınır içinde ortalamak isteyebilirsiniz. Örneğin, sabit bir yakınlaştırma seviyesini korurken kamerayı bir ülkeye ortalamak için. Bu durumda, LatLngBounds oluşturup LatLngBounds ile CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom) kullanarak benzer bir yöntem uygulayabilirsiniz.getCenter() yöntemini kullanın. getCenter() yöntemi, LatLngBounds öğesinin 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, bir dikdörtgen için piksel cinsinden genişlik ve yükseklik belirtmenize olanak tanır. Bu değerlerin haritanın boyutlarına karşılık gelmesi amaçlanır. Dikdörtgen, merkezi harita görünümünün merkeziyle aynı olacak şekilde konumlandırılır (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, kamerayı, belirtilen LatLngBounds, gerekli dolguyu hesaba katarak mümkün olan en yüksek yakınlaştırma seviyesinde, verilen dikdörtgen içinde ekranda ortalanacak şekilde hareket ettirir.
Not: CameraUpdate oluşturmak için daha basit olan newLatLngBounds(boundary, padding) yöntemini yalnızca harita düzeni oluşturulduktan sonra kamerayı hareket ettirmek için kullanacaksanız tercih edin. 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, daha karmaşık olan newLatLngBounds(boundary, width, height, padding) yönteminin döndürdüğü CameraUpdate değerini, harita düzene girmeden önce bile istediğiniz zaman kullanabilirsiniz. Bunun nedeni, API'nin görüntüleme sınırlarını ilettiğiniz bağımsız değişkenlerden hesaplamasıdır.
Kullanıcının kaydırma işlemini belirli bir alanla kısıtlama
Yukarıdaki senaryolarda haritanın sınırlarını belirlersiniz ancak kullanıcı bu sınırların dışında kaydırma veya yakınlaştırma yapabilir. Bunun yerine, haritanın odak noktasının (kamera hedefi) enlem/boylam merkez sınırlarını kısıtlayarak kullanıcıların yalnızca bu sınırlar içinde kaydırma ve yatay kaydırma yapmasına izin verebilirsiniz. Örneğin, bir alışveriş merkezi veya havaalanı için perakende uygulaması, haritayı belirli bir sınırla kısıtlayarak kullanıcıların bu sınırlar içinde kaydırma ve kaydırma yapmasına olanak tanıyabilir.
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 diyagramda, 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 hedefi sınırlı alan içinde kaldığı sürece kaydırma ve yatay kaydırma yapabilir. Artı işareti, kamera hedefini temsil eder:
Harita, görüntü alanının tanımlanan sınırların dışındaki alanları göstermesine neden olsa bile her zaman görüntü alanını doldurur. Örneğin, kamera hedefini sınırlı alanın bir köşesine yerleştirirseniz köşenin ötesindeki alan görüntü alanında görünür ancak kullanıcılar bu alana daha fazla kaydıramaz. Aşağıdaki diyagramda bu senaryo gösterilmektedir. Çapraz, kamera hedefini gösterir:
Aşağıdaki diyagramda, kamera hedefinin çok kısıtlı sınırları vardır. Bu nedenle, kullanıcı haritayı çok az kaydırabilir veya kaydırabilir. Çapraz, kamera hedefini gösterir:
Kamera görünümü güncelleniyor
Haritaya CameraUpdate uygulamak için kamerayı anında hareket ettirebilir veya kameraya yumuşak bir animasyon uygulayabilirsiniz. Kamerayı verilen CameraUpdate ile anında hareket ettirmek için GoogleMap.moveCamera(CameraUpdate) işlevini çağırabilirsiniz.
Özellikle kısa hareketler için değişikliğe animasyon ekleyerek kullanıcı deneyimini daha keyifli hale getirebilirsiniz. Bunun yerine GoogleMap.moveCamera numaralı telefonu aramak için
GoogleMap.animateCamera numaralı telefonu arayın.
Harita, yeni özelliklere sorunsuz bir şekilde 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- Kameranın nereye hareket ettirileceğini açıklayan
CameraUpdatekomutu. callbackGoogleMap.CancellableCallback'yi uygulayan bir nesne. Görevleri işlemek için kullanılan bu genelleştirilmiş arayüz, iki yöntem tanımlar: `onCancel()` ve `onFinished()`. Animasyon için yöntemler aşağıdaki durumlarda çağrılır:onFinish()- Animasyon kesintisiz olarak tamamlanırsa çağrılır.
onCancel()-
Animasyon,
stopAnimation()çağrılarak veya yeni bir kamera hareketi başlatılarak kesintiye uğrarsa çağrılır.Alternatif olarak,
GoogleMap.stopAnimation()yöntemini çağırırsanız da bu durum yaşanabilir.
duration- Animasyonun milisaniye cinsinden istenen süresi (
intolarak).
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));