در حال بارگذاری

پرش به مطلب اصلی

افزودن نشانگر

در این بخش، هدف افزودن یک نشانگر (Marker) به نقطه‌ای از نقشه است که کاربر روی آن لمس طولانی (long click) کرده است.

نکته

این API، همان annotation API استاندارد و درون‌ساخت مپ‌لیبر است — بدون نیاز به افزودن هیچ کتابخانه‌ی جانبی برای کارهای معمول (افزودن، حذف، تغییر آیکون) کاملاً کافی است. برای نیازهای پیشرفته‌تر مانند clustering، می‌توانید از MapLibre Annotation Plugin به عنوان کتابخانه‌ای مجزا استفاده کنید.

ایجاد نشانگر با لمس طولانی روی نقشه

با استفاده از addOnMapLongClickListener، هر بار که کاربر روی نقطه‌ای از نقشه لمس طولانی انجام دهد، یک مارکر در همان نقطه ایجاد می‌شود:

mapView.getMapAsync { map ->
map.setStyle(Style.Builder().fromUri("https://static.neshan.org/sdk/maplibre/styles/light.json"))

map.addOnMapLongClickListener { latLng ->
createMarker(map, latLng)
true
}
}

private fun createMarker(map: MapLibreMap, position: LatLng): Marker {
val icon = IconFactory.getInstance(this).fromResource(R.drawable.ic_marker)
val markerOptions = MarkerOptions()
.position(position)
.icon(icon)
return map.addMarker(markerOptions)
}

آیکون پیش‌فرض مارکر (بدون فراخوانی icon(...)) نیز از طریق IconFactory.getInstance(context).defaultMarker() در دسترس است.

عنوان و توضیحات (Info Window)

با تعیین title و snippet روی MarkerOptions، با کلیک روی مارکر یک info window شامل عنوان و توضیحات نمایش داده می‌شود:

val markerOptions = MarkerOptions()
.position(position)
.title("دفتر مرکزی نشان")
.snippet("تهران، ایران")

val marker = map.addMarker(markerOptions)
marker.showInfoWindow(map, mapView)

به طور پیش‌فرض، در صورتی که مارکری دارای title باشد، با کلیک کاربر روی آن مارکر، info window به صورت خودکار نمایش داده می‌شود. برای پنهان کردن آن نیز کافیست متد marker.hideInfoWindow() را صدا بزنید.

واکنش به کلیک روی مارکر

با استفاده از setOnMarkerClickListener می‌توانید رویداد کلیک روی هر مارکر را دریافت کنید:

map.setOnMarkerClickListener { clickedMarker ->
clickedMarker.icon = IconFactory.getInstance(this).fromResource(R.drawable.ic_marker_selected)
true
}

حذف نشانه‌گر

برای حذف یک مارکر مشخص از روی نقشه، از متد removeMarker استفاده کنید:

map.removeMarker(marker)

برای حذف تمام annotation های نقشه (مارکر، خط، چندضلعی) به صورت یکجا نیز می‌توانید از متد map.clear() استفاده کنید.

افزودن چندین نشانه‌گر به صورت یکجا

در صورتی که چندین مارکر دارید، به جای فراخوانی مکرر addMarker، بهتر است از متد addMarkers که لیستی از MarkerOptions دریافت می‌کند استفاده کنید — این روش کارایی بهتری دارد:

val options = listOf(
MarkerOptions().position(LatLng(35.6892, 51.3890)),
MarkerOptions().position(LatLng(35.7219, 51.3347)),
MarkerOptions().position(LatLng(35.6961, 51.4231)),
)
val markers = map.addMarkers(options)