İşaretçiler haritada tek konumlar belirtir. Varsayılan rengi değiştirerek veya işaretçi simgesini özel bir resimle değiştirerek işaretçilerinizi özelleştirebilirsiniz. Bilgi pencereleri, bir işaretleyiciye ek bağlam sağlayabilir.
Kod örnekleri
GitHub'daki ApiDemos deposu çeşitli işaretçi özelliklerini gösteren bir örnek içerir:
Java
- MapWithMarker: İşaretçisi olan basit bir harita. İşaretçi içeren bir harita ekleme ile ilgili eğiticiye bakın.
- MarkerDemoEtkinlik: Seçenekler ve dinleyiciler dahil olmak üzere bir haritada işaretçiler kullanmak
Kotlin
- MapWithMarker: İşaretçisi olan basit bir harita. Mark-kt ile harita ekleme ile ilgili eğiticiye bakın.
- MarkerDemoEtkinlik: Seçenekler ve dinleyiciler dahil olmak üzere bir haritada işaretçiler kullanmak
Giriş
İşaretçiler, haritadaki konumları tanımlar. Varsayılan işaretçi, Google Haritalar'ın genel görünümü
için ortak bir standart simge kullanır. Simgenin rengini, resmini veya bağlantı noktasını API aracılığıyla değiştirmek mümkündür. İşaretçiler, Marker
türündeki nesnelerdir ve haritaya GoogleMap.addMarker(markerOptions)
yöntemi ile eklenir.
İşaretçiler etkileşimli olacak şekilde tasarlanmıştır. Varsayılan olarak click
etkinlikleri alırlar ve genellikle bilgi pencerelerini açmak için etkinlik işleyicilerle kullanılırlar. İşaretçinin draggable
özelliğinin true
değerine ayarlanması, kullanıcının işaretçinin konumunu değiştirmesine olanak tanır. İşaretçiyi hareket ettirme özelliğini etkinleştirmek için uzun basın.
Varsayılan olarak, bir kullanıcı işaretçiye dokunduğunda, haritanın sağ alt kısmında harita araç çubuğu görünür, böylece kullanıcı Google Haritalar mobil uygulamasına hızlı erişim sahibi olur. Araç çubuğunu devre dışı bırakabilirsiniz. Daha fazla bilgi için kontrol rehberine göz atın.
İşaretçileri kullanmaya başlama
Maps Live'ın bu bölümünde, Android için Haritalar SDK'sını kullanarak haritanıza işaretçi eklemeyle ilgili temel bilgiler ele alınmaktadır.
İşaretçi ekleyin
Aşağıdaki örnekte, haritaya nasıl işaretleyici ekleneceği gösterilmektedir. İşaretçi, -33.852,151.211
koordinatlarında (Sidney, Avustralya) oluşturulur ve tıklandığında bir bilgi penceresinde 'Sidney'de İşaretçi' dizesini gösterir.
Java
@Override public void onMapReady(GoogleMap googleMap) { // Add a marker in Sydney, Australia, // and move the map's camera to the same location. LatLng sydney = new LatLng(-33.852, 151.211); googleMap.addMarker(new MarkerOptions() .position(sydney) .title("Marker in Sydney")); googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); }
Kotlin
override fun onMapReady(googleMap: GoogleMap) { // Add a marker in Sydney, Australia, // and move the map's camera to the same location. val sydney = LatLng(-33.852, 151.211) googleMap.addMarker( MarkerOptions() .position(sydney) .title("Marker in Sydney") ) googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)) }
İşaretçi hakkında ek bilgi görüntüleme
Kullanıcı haritadaki bir işarete dokunduğunda bir yer veya konumla ilgili ek bilgilerin gösterilmesi yaygın bir gereksinimdir. Bilgi pencereleri konulu kılavuza bakın.
Verileri bir işaretçiyle ilişkilendirin
Marker.setTag()
kullanarak rastgele veri nesnesini bir işaretçiyle depolayabilir ve veri nesnesini Marker.getTag()
kullanarak alabilirsiniz. Aşağıdaki örnek, bir işaretçinin etiketler kullanılarak kaç kez tıklandığını nasıl sayabileceğiniz gösterilmektedir:
Java
/** * A demo class that stores and retrieves data objects with each marker. */ public class MarkerDemoActivity extends AppCompatActivity implements GoogleMap.OnMarkerClickListener, OnMapReadyCallback { private final LatLng PERTH = new LatLng(-31.952854, 115.857342); private final LatLng SYDNEY = new LatLng(-33.87365, 151.20689); private final LatLng BRISBANE = new LatLng(-27.47093, 153.0235); private Marker markerPerth; private Marker markerSydney; private Marker markerBrisbane; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_markers); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(this); } /** Called when the map is ready. */ @Override public void onMapReady(GoogleMap map) { // Add some markers to the map, and add a data object to each marker. markerPerth = map.addMarker(new MarkerOptions() .position(PERTH) .title("Perth")); markerPerth.setTag(0); markerSydney = map.addMarker(new MarkerOptions() .position(SYDNEY) .title("Sydney")); markerSydney.setTag(0); markerBrisbane = map.addMarker(new MarkerOptions() .position(BRISBANE) .title("Brisbane")); markerBrisbane.setTag(0); // Set a listener for marker click. map.setOnMarkerClickListener(this); } /** Called when the user clicks a marker. */ @Override public boolean onMarkerClick(final Marker marker) { // Retrieve the data from the marker. Integer clickCount = (Integer) marker.getTag(); // Check if a click count was set, then display the click count. if (clickCount != null) { clickCount = clickCount + 1; marker.setTag(clickCount); Toast.makeText(this, marker.getTitle() + " has been clicked " + clickCount + " times.", Toast.LENGTH_SHORT).show(); } // Return false to indicate that we have not consumed the event and that we wish // for the default behavior to occur (which is for the camera to move such that the // marker is centered and for the marker's info window to open, if it has one). return false; } }
Kotlin
/** * A demo class that stores and retrieves data objects with each marker. */ class MarkerDemoActivity : AppCompatActivity(), OnMarkerClickListener, OnMapReadyCallback { private val PERTH = LatLng(-31.952854, 115.857342) private val SYDNEY = LatLng(-33.87365, 151.20689) private val BRISBANE = LatLng(-27.47093, 153.0235) private var markerPerth: Marker? = null private var markerSydney: Marker? = null private var markerBrisbane: Marker? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_markers) val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment? mapFragment!!.getMapAsync(this) } /** Called when the map is ready. */ override fun onMapReady(map: GoogleMap) { // Add some markers to the map, and add a data object to each marker. markerPerth = map.addMarker( MarkerOptions() .position(PERTH) .title("Perth") ) markerPerth?.tag = 0 markerSydney = map.addMarker( MarkerOptions() .position(SYDNEY) .title("Sydney") ) markerSydney?.tag = 0 markerBrisbane = map.addMarker( MarkerOptions() .position(BRISBANE) .title("Brisbane") ) markerBrisbane?.tag = 0 // Set a listener for marker click. map.setOnMarkerClickListener(this) } /** Called when the user clicks a marker. */ override fun onMarkerClick(marker: Marker): Boolean { // Retrieve the data from the marker. val clickCount = marker.tag as? Int // Check if a click count was set, then display the click count. clickCount?.let { val newClickCount = it + 1 marker.tag = newClickCount Toast.makeText( this, "${marker.title} has been clicked $newClickCount times.", Toast.LENGTH_SHORT ).show() } // Return false to indicate that we have not consumed the event and that we wish // for the default behavior to occur (which is for the camera to move such that the // marker is centered and for the marker's info window to open, if it has one). return false } }
Aşağıda, işaretçilerle veri depolama ve almanın yararlı olduğu senaryolara bazı örnekler verilmiştir:
- Uygulamanız farklı türde işaretçilere hitap edebilir ve kullanıcı tarafından tıklandığında bunları farklı bir şekilde ele almak istersiniz. Bunun için türü belirten işaretçiyle bir
String
depolayabilirsiniz. - Benzersiz kayıt tanımlayıcılarına sahip bir sistemle karşılaşıyor olabilirsiniz. Bu sistemde, işaretçiler ilgili sistemdeki belirli kayıtları temsil eder.
- İşaretçi verileri, işaretçilerin Z-endeksine karar verirken kullanılacak bir öncelik olduğunu gösterebilir.
İşaretçiyi sürüklenebilir yap
İşaretçileri draggable
özelliği true
olarak ayarlandığı sürece, haritaya eklendikten sonra yeniden konumlandırabilirsiniz. Çizimi etkinleştirmek için işaretçiye uzun basın. Parmağınızı ekrandan kaldırdığınızda, işaretçi bu konumda kalır.
İşaretçiler varsayılan olarak sürüklenemez. İşaretçiyi haritaya eklemeden önce MarkerOptions.draggable(boolean)
veya haritaya eklendikten sonra Marker.setDraggable(boolean)
ile açık bir şekilde ayarlamanız gerekir.
İşaretçi sürükleme etkinlikleri bölümünde açıklandığı gibi, işaretçideki sürükleme etkinliklerini dinleyebilirsiniz.
Aşağıdaki snippet, Avustralya'nın Perth şehrinde sürüklenebilir bir işaretçi ekler.
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .draggable(true));
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .draggable(true) )
İşaretçiyi özelleştirin
Bu videoda, konumları harita üzerinde görselleştirmek için işaretçileri kullanma yolları gösterilmektedir.
İşaretçiler, varsayılan simgenin yerine gösterilecek özel bir resim tanımlayabilir. Bir simge tanımlamak, işaretçinin görsel davranışını etkileyen bir dizi özelliğin ayarlanmasını içerir.
İşaretçiler, aşağıdaki özellikler aracılığıyla özelleştirmeyi destekler:
- Konum (Zorunlu)
- İşaretçinin haritadaki konumu için
LatLng
değeri. BirMarker
nesnesi için gereken tek özellik budur. - Çapa
- Resimde, işaretleyicinin EnlBoy konumuna yerleştirilecek nokta. Bu, varsayılan olarak resmin alt kısmının ortasına ayarlanır.
- Alfa
- İşaretçinin opaklığını ayarlar. Varsayılan olarak 1.0 değerine ayarlanır.
- Başlık
- Kullanıcı işaretçiye dokunduğunda bilgi penceresinde gösterilen bir dize.
- Snippet
- Başlığın altında gösterilen ek metin.
- Simge
- Varsayılan işaretçi resminin yerine gösterilen bir bit eşlem.
- Sürüklenebilir
- Kullanıcının işaretçiyi taşımasına izin vermek istiyorsanız
true
değerine ayarlayın. Varsayılan olarakfalse
değerine ayarlanır. - Gösteriliyor
- İşaretçiyi görünmez yapmak için
false
olarak ayarlayın. Varsayılan olaraktrue
kullanılır. - Düz veya İlan Tahtası yönü
- Varsayılan olarak, işaretçiler ilan tahtası yönünü kullanır. Diğer bir deyişle, işaretçiler harita yüzeyine değil, cihaz ekranına doğru çizilir. Haritayı döndürmek, yatırmak veya yakınlaştırmak, işaretçinin yönünü değiştirmez. İşaretçinin yönünü dünya üzerinde düz olacak şekilde ayarlayabilirsiniz. Düz işaretçiler, harita döndürüldüğünde döner ve harita yatırıldığında perspektifi değiştirir. Reklam panosu işaretlerinde olduğu gibi, düz işaretçiler de harita yakınlaştırıldığında veya uzaklaştırıldığında boyutunu korur.
- Döndürme
- İşaretçinin saat yönünde derece cinsinden yönü. İşaretçi düzse, varsayılan konum değişir. Düz bir işaretçinin varsayılan konumu kuzeyde doğrudur. İşaretçi düz olmadığında, varsayılan konum yukarıyı gösterir ve döndürme, işaretçi her zaman kameraya bakacak şekilde olur.
Aşağıdaki snippet, varsayılan simgesiyle basit bir işaretçi oluşturur.
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation));
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) )
İşaretçi rengini özelleştirin
icon() yöntemine bir BitmapDescriptor
nesnesi ileterek varsayılan işaretçi resminin rengini özelleştirebilirsiniz. BitmapDescriptorFactory
nesnesinde önceden tanımlanmış bir renk grubu kullanabilir veya BitmapDescriptorFactory.defaultMarker(float hue)
yöntemiyle özel bir işaretleyici rengi ayarlayabilirsiniz. Ton, renk çemberindeki noktaları temsil eden
0 ile 360 arasında bir değerdir.
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) )
İşaretçi opaklığını özelleştirin
Bir işaretçinin opaklığını MarkerOptions.alpha() yöntemiyle kontrol edebilirsiniz. Alfa, 0 tamamen şeffaf ve 1 tamamen opak, 0.0 ile 1.0 arasında bir hareketli değer olarak belirtilmelidir.
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker(new MarkerOptions() .position(melbourneLocation) .alpha(0.7f));
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .alpha(0.7f) )
İşaretçi resmini özelleştirin
Varsayılan işaretçi resmini, genellikle simge olarak adlandırılan özel bir işaretçi resmiyle değiştirebilirsiniz. Özel simgeler her zaman BitmapDescriptor
olarak ayarlanır ve BitmapDescriptorFactory
sınıfındaki yöntemlerden biri kullanılarak tanımlanır.
fromAsset(String assetName)
- Öğeler dizinindeki bir Bit eşlem resminin adını kullanarak özel bir işaretçi oluşturur.
fromBitmap(Bitmap image)
- Bit eşleme resminden özel bir işaretçi oluşturur.
fromFile(String fileName)
- Dahili depolama biriminde bulunan bir Bit eşleme resim dosyasının adını kullanarak özel bir simge oluşturur.
fromPath(String absolutePath)
- Bitmap görüntüsünün mutlak dosya yolundan özel bir işaretçi oluşturur.
fromResource(int resourceId)
- Bit eşleme resminin kaynak kimliğini kullanarak özel bir işaretçi oluşturur.
Aşağıdaki snippet, özel simgesi olan bir işaretleyici oluşturur.
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)) )
İşaretçiyi düzleştirme
İşaretçi simgeleri normalde ekrana göre çizilir; haritayı döndürmek, eğmek veya yakınlaştırmak işaretçinin yönünü değiştirmez. İşaretçinin yönünü dünya üzerinde düz olacak şekilde ayarlayabilirsiniz. Bu şekilde odaklı işaretçiler, harita döndürüldüğünde döner ve harita yatırıldığında perspektifi değiştirir. Düz işaretçiler, harita yakınlaştırıldığında veya uzaklaştırıldığında boyutunu korur.
İşaretçinin yönünü değiştirmek için işaretçinin flat
özelliğini true
olarak ayarlayın.
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .flat(true));
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .flat(true) )
İşaretçiyi döndürme
İşaretçiyi Marker
ile sabit noktasına göre döndürebilirsiniz.setRotation()
yöntemi. Rotasyon, varsayılan konumdan saat yönünde derece cinsinden ölçülür. İşaretçi haritada düz olduğunda, varsayılan konum
kuzeydir. İşaretçi düz olmadığında, varsayılan konum yukarıyı gösterir ve döndürme, işaretçi her zaman kameraya bakacak şekilde olur.
Aşağıdaki örnek, işaretçiyi 90° döndürür. Sabitleme noktasının 0.5,0.5
olarak ayarlanması, işaretçinin tabanı yerine merkezin etrafına döndürülmesine neden olur.
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .anchor(0.5f,0.5f) .rotation(90.0f));
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .anchor(0.5f, 0.5f) .rotation(90.0f) )
İşaretçi Z-endeksi
Z-endeksi, bu işaretçinin haritadaki diğer işaretçilere göre yığın sırasını belirtir. Yüksek z-endeksine sahip bir işaretçi, daha düşük z-endeksine sahip işaretçilerin üzerine çizilir. Varsayılan Z-endeksi değeri: 0
.
Aşağıdaki kod snippet'inde gösterildiği gibi, MarkerOptions.zIndex()
çağrısı yaparak işaretçinin seçenekler nesnesindeki Z-endeksini ayarlayın:
Java
map.addMarker(new MarkerOptions() .position(new LatLng(10, 10)) .title("Marker z1") .zIndex(1.0f));
Kotlin
map.addMarker( MarkerOptions() .position(LatLng(10.0, 10.0)) .title("Marker z1") .zIndex(1.0f) )
Marker.getZIndex()
için arama yaparak işaretçinin Z-endeksine erişebilirsiniz. Bunun için Marker.setZIndex()
yöntemini çağırabilirsiniz.
İşaretçiler, her zaman diğer bindirmelerin z-endeksinden bağımsız olarak karo katmanlarının ve diğer işaretleyici olmayan yer paylaşımlarının (yer paylaşımları, poligonlar, poligonlar ve diğer şekiller) üzerinde çizilir. İşaretçiler, diğer yer paylaşımlarına kıyasla ayrı bir Z-endeksi grubunda etkin olarak kabul edilir.
Aşağıdaki Z-endeksinin tıklama etkinlikleri üzerindeki etkisi ile ilgili bilgi edinin.
İşaretçi etkinliklerini işleme
Maps API, işaretçi etkinliklerini dinlemenize ve bunlara yanıt vermenize olanak tanır. Bu etkinlikleri dinlemek için işaretçilerin ait olduğu GoogleMap
nesnesinde ilgili dinleyiciyi ayarlamanız gerekir. Etkinlik, haritadaki işaretçilerden birinde gerçekleştiğinde, işleyicinin geri çağırması karşılık gelen Marker
nesnesiyle parametre olarak geçirilerek çağrılır. Bu Marker
nesnesini bir Marker
nesnesine kendi referansınızla karşılaştırmak için ==
yerine equals()
kullanmanız gerekir.
Aşağıdaki etkinlikleri dinleyebilirsiniz:
İşaretçi tıklama etkinlikleri
İşaretçideki tıklama etkinliklerini dinlemek için bir OnMarkerClickListener
kullanabilirsiniz. Bu dinleyiciyi haritada ayarlamak için
GoogleMap.setOnMarkerClickListener(OnMarkerClickListener)
numaralı telefonu arayın. Kullanıcı bir işaretçiyi tıkladığında onMarkerClick(Marker)
çağrılır ve işaretçi, bağımsız değişken olarak iletilir. Bu yöntem, etkinliği kullanıp kullanmadığınızı gösteren bir boole değeri döndürür (ör. varsayılan davranışın atlanmasını istediğiniz). false
değerini döndürürse özel davranışınıza ek olarak varsayılan davranış gerçekleşir. İşaretçi tıklama etkinliği için varsayılan davranış, bilgi penceresini göstermek (varsa) ve kamerayı haritaya ortalanacak şekilde taşımaktır.
Z-endeksinin tıklama etkinlikleri üzerindeki etkisi:
- Kullanıcı bir işaretçi kümesini tıkladığında, tıklama etkinliği en yüksek z-endeksine sahip işaretçi için tetiklenir.
- Tıklama başına en fazla bir etkinlik tetiklenir. Diğer bir deyişle, tıklama işaretçilere veya daha düşük z-endeksi değerlerine sahip diğer yer paylaşımlarına aktarılmaz.
- İşaretçilerden oluşan bir kümenin tıklanması, sırayla her bir tıklamanın seçili kümede döngüye alınmasına neden olur. Döngünün sırası önce z-endeksine, ardından tıklama noktasına yakınlığa öncelik verir.
- Kullanıcı, kümeye yakınlığı tıklarsa API, kümeyi yeniden hesaplar ve tıklama döngüsünün en baştan başlaması için durumu sıfırlar.
- Tıklama etkinliği, döngü yeniden başlatılmadan önce işaretçi kümelerinden diğer şekillere ve yer paylaşımlarına geçer.
- İşaretçiler, diğer yer paylaşımlarının z-endeksine bakılmaksızın, diğer yer paylaşımlarına veya şekillere (çoklu çizgiler, poligonlar, daireler ve/veya zemin bindirmeleri) kıyasla etkin bir şekilde ayrı bir z-endeksi grubunda yer alır. Birden fazla işaretçi, yer paylaşımı veya şekil birbirlerinin üzerine yerleştirilmişse tıklama etkinliği ilk olarak işaretçiler grubu boyunca döngüye alınır ve ardından z-endeksi değerlerine göre, tıklanabilir diğer yer paylaşımları veya şekiller için tetiklenir.
İşaretçi sürükleme etkinlikleri
İşaretçideki sürükleme etkinliklerini
dinlemek için OnMarkerDragListener
kullanabilirsiniz. Bu dinleyiciyi haritada ayarlamak için
GoogleMap.setOnMarkerDragListener
numaralı telefonu arayın. Kullanıcıların, işaretçiyi sürüklemek için işaretçiye uzun basmaları gerekir. Kullanıcı parmağınızı ekrandan aldığında, işaretçi
bu konumda kalır. İşaretçi sürüklendiğinde
onMarkerDragStart(Marker)
ilk olarak çağrılır. İşaretçi çekilirken onMarkerDrag(Marker)
sürekli olarak çağrılır. Sürüklemenin sonunda
onMarkerDragEnd(Marker)
çağrılır. İstediğiniz zaman Marker.getPosition()
numarasını arayarak işaretçinin
konumuna ulaşabilirsiniz.