Android için Haritalar SDK'sındaki haritalar, basit hareketlerle eğilebilir ve döndürülebilir. Böylece 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 deposu, kamera özelliklerini gösteren bir örnek içerir:
- 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 dünya yüzeyini (küre) cihazınızın ekranında (düzlem) gösterir. Doğu ve batı yönünde, dünya kendi etrafında kesintisiz bir şekilde döndüğü için harita sonsuz bir şekilde tekrarlanır. Kuzey ve güney yönünde harita yaklaşık 85 derece kuzey ve 85 derece güney ile sınırlıdır.
Not: Mercator projeksiyonu, boylam olarak sınırlı bir genişliğe ancak enlem olarak sınırsız bir yüksekliğe sahiptir. 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şaretçiler, yer paylaşımları veya diğer grafiklerde herhangi bir değişiklik yapmaz. Ancak eklemelerinizi yeni görünüme daha iyi uyacak şekilde değiştirmek isteyebilirsiniz.
Harita üzerinde kullanıcı hareketlerini dinleyebildiğiniz için haritayı kullanıcı isteklerine göre değiştirebilirsiniz. Örneğin, OnMapClickListener.onMapClick() geri çağırma yöntemi, haritaya tek bir dokunuşa 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.
Bir işaretçinin balonuna dokunmaya veya işaretçi üzerinde sürükleme hareketine 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 arasında (bu değerler dahil) değişir. Bu aralığın üstünde veya altında olan değerler, (-180, 180) aralığına girecek şekilde sarmalanır. Örneğin, 480, 840 ve 1200 değerlerinin tümü 120 dereceye sarmalanır.Yön (oryantasyon)
Kamera yönü, haritanın üst kenarına karşılık gelen pusula yönünü gerçek kuzeyden derece cinsinden ölçerek belirtir. Haritanın merkezinden haritanın üst kenarına dikey bir çizgi çizerseniz yön, 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üneye baktığı 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üyle hizalamak için döndürürken, 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ğı bakan bir kameraya karşılık gelir. 0'dan büyük değerler, belirtilen derece 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. Oluşturulan harita, istemin altında gösteriliyor.
|
|
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ğine dikkat edin. Kamera hâlâ haritanın merkez noktasını gösteriyor ancak 4 konumundaki çizginin temsil ettiği alan artık görünür durumda.
|
|
Bu ekran görüntüsündeki harita, orijinal haritayla aynı noktayı merkeze alıyor ancak haritanın üst kısmında daha fazla özellik görünüyor. Açıyı 45 derecenin üzerine çıkardığınızda, kamera ile harita konumu arasındaki özellikler orantılı olarak daha büyük, harita konumunun ötesindeki özellikler ise 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 dünyanın daha büyük bir kısmı 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ğinde 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 256 * 2N dp'dir. Örneğin, 2. yakınlaştırma seviyesinde tüm dünya yaklaşık 1024 dp genişliğindedir.
Yakınlaştırma seviyesinin tam sayı olması gerekmez. Haritanın izin verdiği yakınlaştırma seviyeleri aralığı; 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
Maps API, haritada dünyanın hangi bölümünün görüneceğini değiştirmenize olanak tanır. Bu, kameranın konumu değiştirilerek (haritayı hareket ettirmek yerine) yapılır.
Kamerayı değiştirdiğinizde, ortaya çıkan kamera hareketine animasyon ekleme 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ı 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 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 bir minimum ve/veya maksimum yakınlaştırma seviyesi ayarlamak faydalı olabilir. Örneğin, uygulamanız bir önemli yerin çevresinde tanımlanmış bir alan gösteriyorsa veya sınırlı sayıda yakınlaştırma seviyesine sahip özel bir karo yer paylaşımı kullanıyorsanız kullanıcının deneyimini kontrol etmek için bu özellikten yararlanabilirsiniz.
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 veya çok az yakınlaştırma yapmasına izin vermesini engelleyebilecek teknik hususlar olduğunu unutmayın. Örneğin, uydu veya arazi, temel harita parçalarından daha düşük bir maksimum yakınlaştırmaya sahip olabilir.
Kamera konumunu değiştirme
Yaygın konum değişiklikleri için iki kolaylık yöntemi vardır.
CameraUpdateFactory.newLatLng(LatLng),
kameranın enlem ve boylamını değiştiren bir CameraUpdate döndürürken
diğer tüm özellikleri korur.
CameraUpdateFactory.newLatLngZoom(LatLng, float),
kameranın enlemini, boylamını ve yakınlaştırma düzeyini değiştiren, diğer tüm özellikleri koruyan bir CameraUpdate döndürür.
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 new CameraPosition.Builder() kullanılarak CameraPosition.Builder ile elde edilebilir.
Kaydırma
CameraUpdateFactory.scrollBy(float, float), haritanın belirtilen piksel sayısı kadar hareket etmesi için kameranın enlem ve boylamını değiştiren bir CameraUpdate sağlar. Pozitif bir x değeri, kameranın sağa hareket etmesine neden olur. Böylece 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. Bu durumda 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ı, ilgilenilen alanın tamamı mümkün olan en yüksek yakınlaştırma seviyesinde görünecek şekilde hareket ettirmek yararlı olabilir. Ö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. Bunu yapmak 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,
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 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, kamerayı bir ülkeye ortalarken yakınlaştırma düzeyini sabit tutmak için bu seçeneği kullanabilirsiniz. Bu durumda, LatLngBounds oluşturup LatLngBounds ile CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom) kullanarak benzer bir yöntem uygulayabilirsiniz.getCenter() yöntemi. 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üzenlendikten sonra kamerayı hareket ettirmek için 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, daha karmaşık olan newLatLngBounds(boundary, width, height, padding) yönteminin döndürdüğü CameraUpdate değerini, harita düzene geçmeden ö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ışına kaydırabilir veya kaydırabilir. 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 sınırlarla 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ı alanda kaldığı sürece kaydırma ve pan yapabilir. Çarpı 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. Çarpı işareti, kamera hedefini temsil eder.
Aşağıdaki diyagramda, kamera hedefinin çok kısıtlı sınırları vardır. Bu nedenle, kullanıcıya haritayı kaydırma veya kaydırma için çok az fırsat sunulur. Çarpı işareti, kamera hedefini temsil eder:
Kamera görünümü güncelleniyor
Haritaya CameraUpdate uygulamak için kamerayı anında hareket ettirebilir veya kameraya sorunsuz bir şekilde 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. Bunu yapmak için GoogleMap.moveCamera yerine GoogleMap.animateCamera yöntemini çağırı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
CameraUpdate. callbackGoogleMap.CancellableCallback'yi uygulayan bir nesne. Görevleri işlemek için kullanılan bu genelleştirilmiş arayüz, `onCancel()` ve `onFinished()` olmak üzere iki yöntem tanımlar. 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));