İşaretçiler haritada tek tek konumları gösterir. 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şaretçi için ek içerik sağlayabilir.
Kod örnekleri
GitHub'daki ApiDemos deposu, çeşitli işaretçi özelliklerini gösteren bir örnek içerir:
Kotlin
- MapWithMarker: İşaretçisi olan basit bir harita. İşaretçi-kt ile harita ekleme ile ilgili eğiticiyi inceleyin.
- MarkerDemoActivity: Haritada seçenekler ve işleyiciler dahil olmak üzere işaretçileri kullanma
Java
- MapWithMarker: İşaretçisi olan basit bir harita. İşaretçiyle harita ekleme ile ilgili eğiticiye bakın.
- MarkerDemoActivity: Haritada seçenekler ve işleyiciler dahil olmak üzere işaretçileri kullanma
Giriş
İşaretçiler haritada konumları tanımlar. Varsayılan işaretçi, Google Haritalar'ın görünüm ve tarzında
yaygın olan standart bir simge kullanır. API aracılığıyla simgenin rengini, resmini veya sabitleme noktasını değiştirmek mümkündür. İşaretçiler Marker
türünde nesnelerdir ve GoogleMap.addMarker(markerOptions)
yöntemiyle haritaya eklenir.
İşaretçiler etkileşimli olacak şekilde tasarlanmıştır. Bunlar varsayılan olarak click
etkinliklerini alır ve genellikle bilgi pencerelerini görüntülemek için etkinlik işleyicilerle birlikte kullanılır. Bir işaretçinin draggable
özelliğinin true
olarak ayarlanması, kullanıcının işaretçinin konumunu değiştirmesine olanak tanır. İşaretçiyi taşıma özelliğini etkinleştirmek için
uzun basın.
Varsayılan olarak, kullanıcı bir işaretçiye dokunduğunda, harita araç çubuğu haritanın sağ alt kısmında görünür ve kullanıcıya Google Haritalar mobil uygulamasına hızlı erişim sağlar. Araç çubuğunu devre dışı bırakabilirsiniz. Daha fazla bilgi için denetimler kılavuzuna bakı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, bir haritaya nasıl işaretçi ekleneceği gösterilmektedir. İşaretçi -33.852,151.211
koordinatlarında (Sidney, Avustralya) oluşturulur ve tıklandığında "İşaretçi Sydney" dizesini bir bilgi penceresinde görüntüler.
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)) }
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)); }
Bir işaretçi hakkında ek bilgi görüntüleme
Kullanıcı haritada bir işaretçiye dokunduğunda bir yer veya konum hakkında ek bilgi göstermek yaygın bir gereksinimdir. Bilgi pencereleri ile ilgili rehberi inceleyin.
Verileri işaretçiyle ilişkilendirme
Marker.setTag()
aracılığıyla işaretçiyle rastgele bir veri nesnesi depolayabilir ve Marker.getTag()
ile bu veri nesnesini alabilirsiniz. Aşağıdaki örnekte, etiketleri kullanarak bir işaretçinin tıklanma sayısını nasıl sayabileceğiniz gösterilmektedir:
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 } }
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; } }
İşaretçilerle veri depolamanın ve almanın yararlı olduğu senaryolara ilişkin bazı örnekleri burada bulabilirsiniz:
- Uygulamanız farklı işaretçi türlerini sağlıyor olabilir ve kullanıcı bunları tıkladığında bunlara farklı bir şekilde davranmak istersiniz. Bunu yapmak için türü belirten işaretçiyle birlikte bir
String
kaydedebilirsiniz. - Benzersiz kayıt tanımlayıcılarına sahip bir sistemle çalışıyor olabilirsiniz. Bu durumda, işaretçiler sistemdeki belirli kayıtları temsil eder.
- İşaretçi verileri, bir işaretçinin Z-endeksine karar verilirken kullanılacak bir önceliği gösterebilir.
İşaretçiyi sürüklenebilir yap
Haritaya eklendikten sonra, draggable
özelliği true
olarak ayarlandığı sürece işaretçiyi yeniden konumlandırabilirsiniz. Sürüklemeyi 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üklenebilir değildir. İşaretçiyi, haritaya eklemeden önce MarkerOptions.draggable(boolean)
veya haritaya eklendikten sonra Marker.setDraggable(boolean)
ile sürüklenebilir şekilde ayarlamanız gerekir.
İşaretçi sürükleme etkinlikleri konusunda açıklandığı gibi işaretçide sürükleme etkinliklerini dinleyebilirsiniz.
Aşağıdaki snippet, Avustralya'nın Perth şehrinde sürüklenebilir bir işaretçi ekler.
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .draggable(true) )
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .draggable(true));
İşaretçiyi özelleştirme
Bu videoda, konumları harita üzerinde görselleştirmek için işaretçileri kullanmanın yolları gösterilmektedir.
İşaretçiler, varsayılan simge yerine gösterilecek özel bir resim tanımlayabilir. Simge tanımlama işlemi, işaretçinin görsel davranışını etkileyen bir dizi özellik ayarlamayı içerir.
İşaretçiler, özelleştirmeyi aşağıdaki özellikler aracılığıyla destekler:
- Pozisyon (Zorunlu)
- İşaretçinin haritadaki konumu için
LatLng
değeri. BirMarker
nesnesi için gerekli tek özelliktir. - Çapa
- Resimde, işaretçinin EnlBoy konumuna yerleştirilecek nokta. Bu varsayılan olarak resmin alt kısmının orta kısmıdı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örüntülenen 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
olarak 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
değerine ayarlanır. - Düz veya İlan tahtası yönü
- İşaretçiler varsayılan olarak ilan tahtasının yönünü kullanır. Diğer bir deyişle, harita yüzeyine değil, cihaz ekranına doğru çizilirler. 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ünyaya göre 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. İlan tahtası işaretçilerinde olduğu gibi, harita yakınlaştırıldığında veya uzaklaştırıldığında düz işaretçilerin boyutlarını korur.
- Döndürme
- İşaretçinin yönü, saat yönünde derece cinsinden belirtilir. İşaretçi düzse varsayılan konum değişir. Düz bir işaretçi için varsayılan konum kuzeye hizalıdır. İşaretçi düz değilse varsayılan konum yukarıyı gösterir ve döndürme, işaretçi her zaman kameraya bakacak şekildedir.
Aşağıdaki snippet, varsayılan simgeyle basit bir işaretçi oluşturur.
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) )
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new MarkerOptions() .position(melbourneLocation));
İşaretçi rengini özelleştirin
icon() yöntemine bir BitmapDescriptor
nesnesi geçirerek varsayılan işaretçi resminin rengini özelleştirmek mümkündür. BitmapDescriptorFactory
nesnesinde önceden tanımlanmış bir renk grubu kullanabilir veya BitmapDescriptorFactory.defaultMarker(float hue)
yöntemiyle özel bir işaretçi rengi ayarlayabilirsiniz. Ton, 0 ile 360 arasında bir değerdir ve renk çemberindeki noktaları temsil eder.
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) )
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker( new 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,0 ile 1,0 arasında bir hareketli değer olarak belirtilmelidir. Burada 0 tamamen şeffaf, 1 tamamen opaktır.
Kotlin
val melbourneLocation = LatLng(-37.813, 144.962) val melbourne = map.addMarker( MarkerOptions() .position(melbourneLocation) .alpha(0.7f) )
Java
final LatLng melbourneLocation = new LatLng(-37.813, 144.962); Marker melbourne = map.addMarker(new MarkerOptions() .position(melbourneLocation) .alpha(0.7f));
İşaretçi resmini özelleştirin
Varsayılan işaretçi resmini, genellikle simge adı verilen ö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)
- Asset dizininde bir Bit Eşlem resminin adını kullanarak özel işaretçi oluşturur.
fromBitmap(Bitmap image)
- Bit Eşlem görüntüsünden özel işaretçi oluşturur.
fromFile(String fileName)
- Dahili depolama alanındaki Bit eşlem görüntü dosyasının adını kullanarak özel simge oluşturur.
fromPath(String absolutePath)
- Bit Eşlem görüntüsünün mutlak dosya yolundan özel işaretçi oluşturur.
fromResource(int resourceId)
- Bit Eşlem görüntüsünün kaynak kimliğini kullanarak özel işaretçi oluşturur.
Aşağıdaki snippet, özel simge içeren bir işaretçi oluşturur.
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)) )
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)));
İş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ünyaya göre düz olacak şekilde ayarlayabilirsiniz. Yönleri bu şekilde olan işaretçiler, harita döndürüldüğünde döner ve harita yatırıldığında perspektifi değiştirir. Harita yakınlaştırıldığında veya uzaklaştırıldığında düz işaretçilerin boyutu korunur.
İşaretçinin yönünü değiştirmek için işaretçinin flat
özelliğini true
olarak ayarlayın.
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .flat(true) )
Java
final LatLng perthLocation = new LatLng(-31.90, 115.86); Marker perth = map.addMarker( new MarkerOptions() .position(perthLocation) .flat(true));
İşaretçiyi döndürme
Marker
kullanarak işaretçiyi sabitleme noktası etrafında döndürebilirsiniz.setRotation()
yöntemini çağırın. Döndürme, varsayılan konumdan saat yönünde
derece cinsinden ölçülür. İşaretçi haritada düz olduğunda, varsayılan
konum Kuzey'dir. İşaretçi düz olmadığında varsayılan konum yukarıyı gösterir ve döndürme de 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 kendi merkezi çevresinde döndürülmesine neden olur.
Kotlin
val perthLocation = LatLng(-31.90, 115.86) val perth = map.addMarker( MarkerOptions() .position(perthLocation) .anchor(0.5f, 0.5f) .rotation(90.0f) )
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));
İşaretçi z-endeksi
Z-endeksi, haritadaki diğer işaretçilere göre bu işaretçinin yığın sırasını belirtir. Düşük Z-endeksli işaretçilerin üzerine yüksek Z-endeksine sahip bir işaretçi çizilir. Varsayılan Z-endeksi değeri 0
değeridir.
Aşağıdaki kod snippet'inde gösterildiği gibi MarkerOptions.zIndex()
yöntemini çağırarak işaretçinin seçenekler nesnesindeki Z-endeksini ayarlayın:
Kotlin
map.addMarker( MarkerOptions() .position(LatLng(10.0, 10.0)) .title("Marker z1") .zIndex(1.0f) )
Java
map.addMarker(new MarkerOptions() .position(new LatLng(10, 10)) .title("Marker z1") .zIndex(1.0f));
İşaretçinin Z-endeksine Marker.getZIndex()
yöntemini çağırarak erişebilir, Marker.setZIndex()
yöntemini çağırarak da değiştirebilirsiniz.
İşaretçiler, diğer bindirmelerin z endeksinden bağımsız olarak her zaman karo katmanlarının ve işaretleyici olmayan diğer bindirmelerin (zemin yer paylaşımları, çoklu çizgiler, poligonlar ve diğer şekiller) üzerinde çizilir. İşaretçiler, diğer yer paylaşımlarına kıyasla etkin bir şekilde ayrı bir Z-endeksi grubunda kabul edilir.
Aşağıdaki Z-endeksinin tıklama etkinlikleri üzerindeki etkisi hakkında 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 karşılık gelen işleyiciyi ayarlamanız gerekir. Etkinlik haritadaki işaretleyicilerden birinde meydana geldiğinde dinleyicinin geri çağırması, parametre olarak geçirilen karşılık gelen Marker
nesnesiyle çağrılır. Bu Marker
nesnesini bir Marker
nesnesine yaptığınız referansla karşılaştırmak için ==
değil equals()
kullanmanız gerekir.
Aşağıdaki etkinlikleri dinleyebilirsiniz:
İşaretçi tıklama etkinlikleri
İşaretçideki tıklama etkinliklerini dinlemek için OnMarkerClickListener
kullanabilirsiniz. Bu işleyiciyi 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 aktarılır. Bu yöntem, etkinliği tüketip tüketmediğinizi (yani varsayılan davranışı bastırmak isteyip istemediğinizi) belirten bir boole döndürür. false
döndürürse özel davranışınıza ek olarak varsayılan davranış da gerçekleşir. İşaretçi tıklama etkinliğinin varsayılan davranışı, bilgi penceresini (varsa) göstermek ve kamerayı, işaretçi haritanın merkezinde olacak şekilde hareket ettirmektir.
Z-endeksinin tıklama etkinlikleri üzerindeki etkisi:
- Kullanıcı bir işaretçi kümesini tıkladığında, en yüksek Z-endeksine sahip işaretçi için tıklama etkinliği tetiklenir.
- Tıklama başına en fazla bir etkinlik tetiklenir. Başka bir deyişle, tıklama daha düşük Z-endeksi değerlerine sahip işaretçilere veya diğer yer paylaşımlarına iletilmez.
- Bir işaretçi kümesini tıklamak, sonraki tıklamaların kümede döngüye girmesine ve her birini sırayla seçmesine neden olur. Döngünün sırası önce Z-endeksine, daha sonra tıklama noktasına yakınlığa öncelik verir.
- Kullanıcı kümenin yakınlığının dışına tıklama yaparsa API, kümeyi yeniden hesaplar ve tıklama döngüsünün durumunu sıfırlayarak baştan başlar.
- Tıklama etkinliği, döngüyü yeniden başlatmadan önce işaretçi kümelerinden diğer şekillere ve yer paylaşımlarına düşer.
- İşaretçiler, diğer bindirmelerin z-endeksinden bağımsız olarak, diğer bindirmelere veya şekillere (çoklu çizgiler, poligonlar, daireler ve/veya zemin yer paylaşımları) kıyasla ayrı bir Z-endeksi grubunda yer alırlar. Birden çok işaretçi, bindirme veya şekil birbirinin üzerine yerleştirilirse, tıklama etkinliği önce işaretçi kümesi içinde döner ve ardından Z-endeksi değerlerine göre diğer tıklanabilir yer paylaşımları veya şekiller için tetiklenir.
İşaretçi sürükleme etkinlikleri
Etkinlikleri bir işaretçi üzerinde sürüklemek için OnMarkerDragListener
kullanabilirsiniz. Bu işleyiciyi haritada ayarlamak için GoogleMap.setOnMarkerDragListener
numaralı telefonu arayın. İşaretçiyi sürüklemek için kullanıcının işaretçiye
uzun basması gerekir. Kullanıcı parmağını ekrandan kaldırdığında, işaretçi bu konumda kalır. Bir işaretçi sürüklendiğinde başlangıçta onMarkerDragStart(Marker)
çağrılır. İşaretçi sürüklenirken onMarkerDrag(Marker)
sürekli olarak çağrılır. Sürüklemenin sonuna onMarkerDragEnd(Marker)
çağrılır. Marker.getPosition()
numaralı telefonu arayarak işaretçinin konumunu istediğiniz zaman öğrenebilirsiniz.