
Karo yer paylaşımı (bazen karo katmanı olarak da bilinir) temel harita karolarının üstünde görüntülenen resimlerden oluşur.
Kod Örnekleri
GitHub'daki ApiDemos deposu, karo yer paylaşımı özelliğini gösteren bir örnek içerir:
- TileOverlayDemoActivity - Java: Java'da yer paylaşımlı yer paylaşımı özellikleri
- TileordDemoActivity - Java: Java'daki karo yer paylaşımları için kullanılan koordinat sistemi
- TileOverlayDemoActivity - Kotlin: Kotlin'deki karo yer paylaşımı özellikleri
- Tile KoordinatörDemoEtkinlik - Kotlin: Kotlin'deki karo yer paylaşımları için kullanılan koordinat sistemi
Giriş
TileOverlay
, temel harita parçalarının üzerine eklenen bir dizi resmi tanımlar.
Desteklemek istediğiniz her yakınlaştırma düzeyi için karoları sağlamanız gerekir. Birden çok yakınlaştırma düzeyinde yeterli sayıda karonuz varsa, haritanın tamamı için Google'ın harita verilerini tamamlayabilirsiniz.
Karo yer paylaşımları, genellikle geniş coğrafi alanları kapsayan haritaya geniş görüntüler eklemek istediğinizde kullanışlıdır. Buna karşılık, yer paylaşımları haritadaki tek bir alandaki tek bir resmi düzeltmek istediğinizde yararlıdır.
Ayrıca, karo yer paylaşımında programatik olarak bir şeffaflık faktörü ayarlayarak veya şeffaf karo resimleri sağlayarak haritaya fazladan özellikler eklemek için şeffaf karo yer paylaşımları da kullanabilirsiniz.
Parça koordinatları ve yakınlaştırma seviyeleri
Google Haritalar API'sı, her yakınlaştırma düzeyindeki görüntüleri ızgara düzeninde düzenlenmiş kare harita bloklarına ayırır. Bir harita yeni bir konuma veya yeni bir yakınlaştırma düzeyine geçtiğinde, Haritalar API'sı hangi karolara ihtiyaç duyduğunu belirler ve bu bilgileri almak için bir karo grubuna dönüştürür.
Koordinatlar (0,0) içeren karo her zaman haritanın kuzeybatı köşesindedir, x değerleri batıdan doğuya ve y değerleri ise kuzeyden güneye artar. Kartlar, o kaynaktaki x, y koordinatları kullanılarak dizine eklenir.
Yakınlaştırma düzeyi 0'da, tüm dünya tek bir karo içinde oluşturulur. Her yakınlaştırma düzeyi, büyütmeyi iki kat artırır. Dolayısıyla, yakınlaştırma düzeyi 1'de harita, 2x2'lik bir karo ızgarası olarak oluşturulur. 2. yakınlaştırma düzeyinde 4x4 boyutunda bir ızgaradır. Yakınlaştırma düzeyi 3'te 8x8 boyutlu bir ızgaradır vb.
Örneğin, 2. yakınlaştırma düzeyinde yerküre 16 karoya bölünür. Her Kart'a benzersiz bir x, y ve yakınlaştırma kombinasyonuyla referans verilebilir:

Döşeme katmanı için resim oluştururken, desteklemek istediğiniz her yakınlaştırma düzeyinde her karo için bir resim oluşturmanız gerekir. Google Haritalar, karoları görüntülerken 256 dp (cihazdan bağımsız piksel) hedefler. Yüksek çözünürlüklü cihazlar için yüksek dpi karolar (512x512 piksel) döndürmeniz önerilir. Farklı ekran boyutlarını ve yoğunluklarını destekleme hakkında bilgi edinmek için Android Geliştiricileri belgelerini inceleyin.
Not: Kamera tarafından desteklenen yakınlaştırma düzeyleri, çeşitli faktörlere bağlıdır ve karolarınızın destekleyeceği yakınlaştırma düzeyleriyle ilgili değildir.
-
GoogleMap.getMaxZoomLevel()
, mevcut kamera konumunda kullanılabilecek maksimum yakınlaştırma düzeyini döndürür. Bu işlem, şu anda kullanılan harita türünü dikkate alır. Örneğin, bir uydu veya arazi haritası, temel harita karolarından daha düşük bir maksimum yakınlaştırma düzeyine sahip olabilir. -
GoogleMap.getMinZoomLevel()
, maksimum yakınlaştırma düzeyinin aksine her konum için aynı olan minimum yakınlaştırma düzeyini döndürür ancak cihazlar ile harita boyutları arasında farklılık gösterebilir.
Karo yer paylaşımı ekle
Karo yer paylaşımı oluşturmanın en basit ve en yaygın yolu, alakalı karo resmini işaret eden bir URL sağlamaktır.
UrlTileProvider
, bir URL'yi temel alarak resim karoları sağlayan TileProvider
uygulamasının kısmi bir uygulamasıdır. Bu sınıf, tüm resimlerin aynı boyutlara sahip olmasını gerektiriyor.
Kart koordinatlarını (x, y, yakınlaştırma) kabul eden ve karo için kullanılacak resmi işaret eden bir URL döndüren UrlTileProvider.getTileUrl()
özelliğini uygulamanız gerekir. Belirtilen x, y ve yakınlaştırma için karo yoksa yöntem boş olmalıdır. URL bir web kaynağını, Android öğesini veya yerel diskteki bir dosyayı işaret edebilir.
Desteklemek istediğiniz tüm x, y koordinatları ve yakınlaştırma düzeyleri için bir sunucu üzerinde karo resim stokunuzu ayarlayın. Ardından karo yer paylaşımını ekleyin:
- Karo resimleri sağlamak için bir
UrlTileProvider
tanımlayın. - Her kutucuk resminin URL'sini oluşturmak için
getTileUrl()
politikasını geçersiz kılın. - Alakalı seçenekleri içeren bir
TileOverlayOptions
nesnesi sağlayın: fadeIn
: Boole. Kartların belirip belli olmayacağını belirtir. Varsayılan değer:true
Karo yer paylaşımları arasında hızlı bir şekilde geçiş yaparken geçiş efektini kapatmanız yararlı olabilir. Şeffaflık ve şeffaflaşma arasındaki ilişki hakkında bilgi için aşağıdaki şeffaflık bölümüne bakın.tileProvider
: Bu yer paylaşımı için kullanılacakTileProvider
.transparency
: Kayan. Karo resimler için şeffaflık faktörü belirler. Değer[0.0f, 1.0f]
aralığında olmalıdır. Burada0.0f
, tamamen opak (varsayılan) ve1.0f
tamamen şeffaf anlamına gelir. Kod örneği ve şeffaflık ile şeffaflaşma arasındaki ilişki için aşağıdaki şeffaflık bölümüne bakın.visible
: Boole. Karo yer paylaşımının görünürlüğünü belirtir. Görünmez karo yer paylaşımı (false
değeri) harita üzerinde çizilmez, ancak diğer tüm özelliklerini korur. Varsayılan değer:true
.zIndex
: Karo yer paylaşımının yer paylaşımları, daireler, poligon ve poligonlar dahil diğer yer paylaşımlarıyla ilişkili olarak hangi sırayla çizileceğini belirler. Daha yüksek Z-endeksine sahip yer paylaşımları, daha düşük Z-endeksine sahip olanların üzerine alınır. Aynı z-endeksine sahip yer paylaşımları, rastgele sıralanır. Varsayılan Z-endeksi 0'dır. İşaretçilerin diğer yer paylaşımlarının z endeksinden bağımsız olarak her zaman diğer yer paylaşımlarının üzerine çizildiğini unutmayın.- Yer paylaşımını haritaya eklemek için
GoogleMap.addTileOverlay()
numaralı telefonu arayın.
Java
private GoogleMap map; TileProvider tileProvider = new UrlTileProvider(256, 256) { @Override public URL getTileUrl(int x, int y, int zoom) { /* Define the URL pattern for the tile images */ String s = String.format("http://my.image.server/images/%d/%d/%d.png", zoom, x, y); if (!checkTileExists(x, y, zoom)) { return null; } try { return new URL(s); } catch (MalformedURLException e) { throw new AssertionError(e); } } /* * Check that the tile server supports the requested x, y and zoom. * Complete this stub according to the tile range you support. * If you support a limited range of tiles at different zoom levels, then you * need to define the supported x, y range at each zoom level. */ private boolean checkTileExists(int x, int y, int zoom) { int minZoom = 12; int maxZoom = 16; return (zoom >= minZoom && zoom <= maxZoom); } }; TileOverlay tileOverlay = map.addTileOverlay(new TileOverlayOptions() .tileProvider(tileProvider));
Kotlin
private lateinit var map: GoogleMap var tileProvider: TileProvider = object : UrlTileProvider(256, 256) { override fun getTileUrl(x: Int, y: Int, zoom: Int): URL? { /* Define the URL pattern for the tile images */ val url = "http://my.image.server/images/$zoom/$x/$y.png" return if (!checkTileExists(x, y, zoom)) { null } else try { URL(url) } catch (e: MalformedURLException) { throw AssertionError(e) } } /* * Check that the tile server supports the requested x, y and zoom. * Complete this stub according to the tile range you support. * If you support a limited range of tiles at different zoom levels, then you * need to define the supported x, y range at each zoom level. */ private fun checkTileExists(x: Int, y: Int, zoom: Int): Boolean { val minZoom = 12 val maxZoom = 16 return zoom in minZoom..maxZoom } } val tileOverlay = map.addTileOverlay( TileOverlayOptions() .tileProvider(tileProvider) )
Bir UrlTileProvider
örneğini çalışırken görmek için Google Play Hizmetleri SDK'sı ile birlikte sunulan örnek koddaki TileOverlayDemoActivity
bölümüne bakın.
Karo yer paylaşımlarının şeffaflığını ayarlayın
Kullanıcıların yer paylaşımlı karoların altındaki temel haritayı görebilmesi için şeffaf karolara harita üzerinde yer paylaşımı yapmak yararlı olabilir. Bunu kendi şeffaf bloklarınızı sağlayarak veya karo yer paylaşımında programatik olarak bir şeffaflık faktörü belirleyerek yapabilirsiniz.
Aşağıdaki kod örneği, karo yer paylaşımının şeffaflığını 0.5f
ve 0.0f
arasında açar:
Java
private TileOverlay tileOverlayTransparent; @Override public void onMapReady(GoogleMap map) { tileOverlayTransparent = map.addTileOverlay(new TileOverlayOptions() .tileProvider(new UrlTileProvider(256, 256) { // ... }) .transparency(0.5f)); } // Switch between 0.0f and 0.5f transparency. public void toggleTileOverlayTransparency() { if (tileOverlayTransparent != null) { tileOverlayTransparent.setTransparency(0.5f - tileOverlayTransparent.getTransparency()); } }
Kotlin
private var tileOverlayTransparent: TileOverlay? = null override fun onMapReady(map: GoogleMap) { tileOverlayTransparent = map.addTileOverlay( TileOverlayOptions() .tileProvider(object : UrlTileProvider(256, 256) { // ... }) .transparency(0.5f) ) } // Switch between 0.0f and 0.5f transparency. fun toggleTileOverlayTransparency() { tileOverlayTransparent?.let { it.transparency = 0.5f - it.transparency } }
Şeffaflık, karo resimler için alfa kanal çarpanı olarak uygulanır. Karo yer paylaşımının şeffaflığını ayarlamak için, yukarıdaki örnekte gösterildiği gibi [0.0f, 1.0f]
aralığında transparency
değerine sahip bir TileOverlayOptions
nesnesi sağlayın. 0.0f
değeri, karo yer paylaşımının tamamen opak, 1.0f
değerinin tamamen şeffaf olduğu anlamına gelir. Varsayılan değer 0.0f
(opak) şeklindedir.
Karo yer paylaşımının şeffaflığına erişmek için TileOverlay.getTransparency()
yöntemini çağırabilir ve bunu TileOverlay.setTransparency()
yöntemini çağırarak değiştirebilirsiniz.
Şeffaflık, animasyon ve belirme efekti
Şeffaflık değiştiğinde animasyon bulunmaz. Şeffaflık seçeneği, fadeIn seçeneğiyle birlikte çalışır.
Belirme, karo yüklenirken şeffaflık sağlar. Şeffaflık değeri ayarlarsanız karolar, tamamen şeffaflıktan tanımlanan şeffaflık değerine döner. Şeffaflaştırma sırasında şeffaflığı değiştirirseniz animasyon yeni hedef şeffaflığına doğru devam eder.
Karo yer paylaşımını kaldırma
Karo yer paylaşımını TileOverlay.remove()
yöntemiyle kaldırabilirsiniz.
Java
tileOverlay.remove();
Kotlin
tileOverlay?.remove()
Eski blokları temizle
Karo yer paylaşımı tarafından sağlanan kartlar 'eski' olursa, yenilemeyi zorunlu kılmak için clearTileCache()
yöntemini çağırabilirsiniz. Bu, yer paylaşımındaki tüm kartların yeniden yüklenmesine neden olur. Örneğin, TileProvider
tarafından sağlanan kartlar değişirse önceki kartların artık oluşturulmadığından emin olmak için daha sonra clearTileCache()
yöntemini çağırmanız gerekir.
Java
tileOverlay.clearTileCache();
Kotlin
tileOverlay?.clearTileCache()