Android için Haritalar SDK'sındaki haritalar kolay hareketlerle eğilip döndürülebilir. Böylece kullanıcılar, haritayı kendileri için anlamlı bir yöne göre ayarlayabilir. Herhangi bir yakınlaştırma düzeyinde, vektör tabanlı harita döşemelerinin daha küçük yer kaplaması sayesinde haritayı çok az gecikmeyle kaydırabilir veya perspektifini değiştirebilirsiniz.
Kod örnekleri
GitHub'daki ApiDemos deposunda, kamera özelliklerini gösteren bir örnek yer alır:
- CameraDemoActivity - Kotlin: Kamera konumunu değiştirme
- CameraDemoActivity - Java: Kamera konumunu değiştirme
Giriş
Android için Haritalar SDK'sı, web'deki Google Haritalar gibi, 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 sorunsuz bir şekilde döndüğü için sonsuza kadar 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: Bir Mercator projeksiyonu, boylamasına sınırlı bir genişliğe ancak enlemesine sınırsız bir yüksekliğe sahiptir. Sonuçta elde edilen harita şeklinin kare olması için Mercator projeksiyonunu kullanarak temel harita görüntülerini yaklaşık +/- 85 derecede "kesiyoruz". Bu sayede, karo seçimi için daha kolay bir mantık kullanılabiliyor.
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.
Haritada kullanıcı hareketlerini dinleyebildiğiniz için kullanıcı isteklerine yanıt olarak haritayı değiştirebilirsiniz. Örneğin, geri çağırma yöntemi
OnMapClickListener.onMapClick()
haritaya tek bir dokunmaya yanıt verir. Yöntem, dokunulan konumun enlemini 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.
Ayrıca kamera hareketlerini de dinleyebilirsiniz. Böylece, kamera hareket etmeye başladığında, hareket ederken veya hareket etmeyi bıraktığında uygulamanız bildirim alır. 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üzleme yukarıdan bakan bir kamera olarak modellenir. Kameranın konumu (ve dolayısıyla haritanın oluşturulması) şu özelliklerle belirtilir: target (enlem/boylam konumu), bearing, tilt ve zoom.
Hedef (konum)
Kamera hedefi, haritanın merkezinin konumudur ve enlem ile boylam koordinatları olarak belirtilir.
Enlem -85 ile 85 derece arasında (bu değerler dahil) olabilir. Bu aralığın üzerindeki veya altındaki değerler, bu aralıktaki en yakın değere sabitlenir. Örneğin, 100 enlemini belirtmek değeri 85 olarak ayarlar. Boylam, -180 ile 180 derece arasında (bu değerler dahil) olmalıdır. Bu aralığın üstündeki veya altındaki değerler, aralığa (-180, 180) girecek şekilde sarmalanır. Örneğin, 480, 840 ve 1200 değerleri 120 dereceye sarılır.Rulman (yön)
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 doğru dikey bir çizgi çizerseniz kerteriz, kameranın gerçek kuzeye göre yönüne (derece cinsinden ölçülür) karşılık gelir.
0 değeri, haritanın üst kısmının gerçek kuzeyi gösterdiği anlamına gelir. 90 derece 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, bir haritanın yönünü değiştirmenize olanak tanır. Örneğin, araba kullanan biri genellikle yol haritasını seyahat yönüyle aynı hizaya getirirken harita ve pusula kullanan yürüyüşçüler genellikle haritayı dikey bir çizgi kuzeyi gösterecek şekilde yönlendirir.
Eğme (görüş açısı)
Eğme, kameranın haritanın merkez konumunun doğrudan üzerinde bulunan bir yay üzerindeki konumunu tanımlar. Bu konum, nadir noktasından (kameranın doğrudan altına doğru bakan yön) itibaren derece cinsinden ölçülür. 0 değeri, doğrudan aşağıyı gösteren 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üş açısını değiştirdiğinizde harita perspektifli olarak görünür. 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 şeması gösterilmektedir. 1 konumu kamera konumu, 2 konumu ise mevcut harita konumudur. Elde edilen harita, bunun altında gösterilir.
|
|
Aşağıdaki resimlerde görüntüleme açısı 45 derecedir. Kameranın, 3 konumuna gelmek için doğrudan yukarı (0 derece) ile yer (90 derece) arasındaki bir yay boyunca yarıya kadar hareket ettiğini unutmayın. Kamera hâlâ haritanın merkez noktasını gösteriyor ancak 4 konumundaki çizgiyle gösterilen 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, 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 düzeyi, 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 düzeyinde, haritanın ölçeği tüm dünyanın yaklaşık 256 dp (yoğunluktan bağımsız piksel) genişliğinde olacak şekildedir.
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 olarak 256 * 2N dp'dir. Örneğin, 2. yakınlaştırma düzeyinde tüm dünya yaklaşık 1024 dp genişliğindedir.
Yakınlaştırma düzeyi 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, bir sonraki en yakın geçerli değere (minimum veya maksimum yakınlaştırma düzeyi) dönüştürülür. 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: Ana kara/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, haritayı hareket ettirmek yerine kameranın konumunu değiştirerek yapılır.
Kamerayı değiştirdiğinizde ortaya çıkan kamera hareketini animasyon haline getirebilirsiniz. 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ı nereye taşımak istediğinizi belirtmeniz gerekir. Maps API, CameraUpdate
kullanarak birçok farklı türde CameraUpdateFactory
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ırma ayarlama
CameraUpdateFactory.zoomIn()
ve
CameraUpdateFactory.zoomOut()
diğer tüm özellikleri aynı tutarak yakınlaştırma düzeyini 1, 0 oranında değiştiren bir CameraUpdate
sağlar.
CameraUpdateFactory.zoomTo(float)
diğer tüm özellikleri aynı tutarken yakınlaştırma düzeyini belirtilen değere değiştiren bir CameraUpdate
sağlar.
CameraUpdateFactory.zoomBy(float)
ve
CameraUpdateFactory.zoomBy(float, Point)
size yakınlaştırma düzeyini verilen değer kadar artıran (veya değer negatifse azaltan) bir CameraUpdate
verir. İkincisi, ekrandaki belirli bir noktayı aynı konumda (enlem/boylam) kalacak şekilde sabitler ve bu nedenle kameranın konumunu değiştirebilir.
Tercih edilen minimum ve/veya maksimum yakınlaştırma seviyesi ayarlamak faydalı olabilir. Örneğin, uygulamanız bir ilgi alanı etrafında tanımlanmış bir alan gösteriyorsa veya sınırlı bir dizi yakınlaştırma düzeyiyle özel bir karo yerleşimi kullanıyorsanız bu özellik, kullanıcının deneyimini kontrol etmek için yararlı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 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 döşemelerinden daha düşük bir maksimum yakınlaştırma düzeyine 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)
, diğer tüm özellikleri korurken kameranın enlemini ve boylamını değiştiren bir CameraUpdate
sağlar.
CameraUpdateFactory.newLatLngZoom(LatLng, float)
size, diğer tüm özellikleri korurken kameranın enlemini, boylamını ve yakınlaştırmasını değiştiren bir CameraUpdate
verir.
Kamera konumunu tamamen esnek bir şekilde değiştirmek için CameraUpdateFactory.newCameraPosition(CameraPosition)
simgesini kullanın. Bu simge, 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 enlemini ve boylamını değiştiren bir CameraUpdate
sağlar. 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ğı hareket etmesine neden olur. Bu nedenle, harita yukarı hareket etmiş gibi görünür. Buna karşılık, negatif x değerleri kameranın sola hareket etmesine neden olur. Bu nedenle, 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 düzeyinde 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. Bunu yapmak için öncelikle ekranda görünmesini istediğiniz LatLngBounds
değerini hesaplayın. Ardından, belirtilen LatLngBounds
'in tamamen haritaya sığması için kamera konumunu değiştiren bir CameraUpdate
elde etmek üzere CameraUpdateFactory.newLatLngBounds(LatLngBounds bounds, int
padding)
kullanabilirsiniz. Bu işlemde, belirtilen dolgu (piksel cinsinden) dikkate alınır. Döndürülen CameraUpdate
değeri, 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 yerleştirme
Bazı durumlarda, kameranızı en uç kenarları dahil etmek yerine belirli sınırlar içinde ortalamak isteyebilirsiniz. Örneğin, kamerayı sabit bir yakınlaştırma seviyesinde tutarak bir ülkenin ortasına yerleştirmek için. Bu durumda, benzer bir yöntem kullanabilirsiniz.
LatLngBounds
oluşturup CameraUpdateFactory.newLatLngZoom(LatLng latLng, float zoom)
ile birlikte LatLngBounds
kullanarak.getCenter()
yöntemi. getCenter() yöntemi, LatLngBounds
bölgesinin 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));
Yöntemin aşırı yüklenmesi olan newLatLngBounds(boundary, width, height,
padding)
, 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 haritanın görünümüyle aynı olacak şekilde konumlandırılır (belirtilen boyutlar haritanın görünümünün boyutlarıyla aynıysa dikdörtgen, haritanın görünümüyle çakışır). Döndürülen CameraUpdate
, kamerayı, belirtilen LatLngBounds
, gerekli dolgu dikkate alınarak mümkün olan en yüksek yakınlaştırma düzeyinde, verilen dikdörtgen içinde ekrana ortalanacak şekilde hareket ettirir.
Not: CameraUpdate
oluşturmak için yalnızca daha basit olan yöntemi kullanın
newLatLngBounds(boundary, padding)
Harita düzenlendikten sonra kamerayı hareket ettirmek için kullanılacaksa. 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ı ilettiğiniz bağımsız değişkenlerden hesapladığı için harita düzenlenmeden önce bile daha karmaşık olan newLatLngBounds(boundary, width, height, padding)
yöntemi tarafından döndürülen CameraUpdate
öğesini istediğiniz zaman kullanabilirsiniz.
Kullanıcının kaydırmasını belirli bir alanla sınırlama
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, kullanıcıların yalnızca bu sınırlar içinde kaydırıp yakınlaştırabilmesi için haritanın odak noktasının (kamera hedefi) enlem/boylam merkezi sınırlarını kısıtlamak isteyebilirsiniz. Örneğin, bir alışveriş merkezi veya havaalanı için perakende uygulaması, haritayı belirli bir sınıra göre kısıtlamak isteyebilir. Bu sayede kullanıcılar, bu sınırlar içinde kaydırma ve yakınlaştırma yapabilir.
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. Kamera hedefi sınırlı alan içinde kaldığı sürece kullanıcı kaydırma ve yakınlaştırma yapabilir. Çapraz, kamera hedefini temsil eder:
Harita, görüntü alanı tanımlanmış sınırlar dışında kalan alanları gösterse 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 temsil eder:
Aşağıdaki şemada, kamera hedefinin sınırları çok kısıtlıdır ve kullanıcıya haritayı kaydırma veya yakınlaştırma için çok az fırsat sunar. Çapraz, kamera hedefini gösterir:
Kamera görünümünü güncelleme
Haritaya CameraUpdate
uygulamak için kamerayı anında hareket ettirebilir veya kamerayı sorunsuz bir şekilde canlandırabilirsiniz. Kamerayı verilen CameraUpdate
ile anında hareket ettirmek için GoogleMap.moveCamera(CameraUpdate)
'ı arayabilirsiniz.
Özellikle kısa hareketlerde değişikliği animasyonla göstererek kullanıcı deneyimini daha keyifli hale getirebilirsiniz. Arama yapmak yerine
GoogleMap.moveCamera
arama simgesine
GoogleMap.animateCamera
dokunun.
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 taşınacağını açıklayan
CameraUpdate
(Kamera) callback
GoogleMap.CancellableCallback
öğesini 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 kesintiye uğramadan tamamlandığında ç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()
numarasını aradığınızda da bu durum yaşanabilir.
duration
- Animasyonun istenen süresi (milisaniye cinsinden)
int
olarak.
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));