如何为现有Map Marker添加多个Drawable?点击后右下角新增图标
为地图Marker添加额外图标的实现方案
当然可以给Marker添加额外图标,下面是两种实用的实现思路:
方案一:自定义Marker布局(推荐)
直接做一个包含主Pin图标和右下角小图标的布局文件(比如marker_custom_layout.xml),用RelativeLayout或者ConstraintLayout把两个图标摆好位置。点击Marker时,把这个布局转成Bitmap替换掉原Marker图标就行。
示例代码(以Kotlin为例,适配Google Maps):
map.setOnMarkerClickListener { marker -> // 加载自定义布局 val customView = LayoutInflater.from(context).inflate(R.layout.marker_custom_layout, null) // 按需设置额外图标,比如更换不同的小图标 // customView.findViewById<ImageView>(R.id.extra_icon).setImageResource(R.drawable.your_target_icon) // 将布局转为Bitmap customView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) customView.layout(0, 0, customView.measuredWidth, customView.measuredHeight) val bitmap = Bitmap.createBitmap(customView.measuredWidth, customView.measuredHeight, Bitmap.Config.ARGB_8888) val canvas = Canvas(bitmap) customView.draw(canvas) // 更新Marker图标 marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap)) true }
这种方式的好处是布局灵活,不仅能加图标,还能随便加文字、调整大小位置,适配各种需求。
方案二:动态组合Drawable
如果不想用布局,也可以用LayerDrawable把主图标和额外图标叠在一起,计算好偏移量让小图标落在右下角。
示例代码:
map.setOnMarkerClickListener { marker -> val originalMarker = ContextCompat.getDrawable(context, R.drawable.original_marker_pin) val extraIcon = ContextCompat.getDrawable(context, R.drawable.extra_icon) ?: return@setOnMarkerClickListener true // 组合两个Drawable val layerDrawable = LayerDrawable(arrayOf(originalMarker, extraIcon)) // 设置小图标偏移:右下角,数值根据图标尺寸调整 val iconSize = extraIcon.intrinsicWidth layerDrawable.setLayerInset(1, (originalMarker?.intrinsicWidth ?: 0) - iconSize, (originalMarker?.intrinsicHeight ?: 0) - iconSize, 0, 0) // 转成Bitmap设置给Marker val bitmap = Bitmap.createBitmap(layerDrawable.intrinsicWidth, layerDrawable.intrinsicHeight, Bitmap.Config.ARGB_8888) val canvas = Canvas(bitmap) layerDrawable.setBounds(0, 0, canvas.width, canvas.height) layerDrawable.draw(canvas) marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap)) true }
注意这里的偏移量要根据你实际的图标大小调整,不然位置会歪。
额外提示
- 如果需要点击其他Marker时恢复当前Marker的原图标,可以在回调里记录上一个点击的Marker,下次点击时重置它的图标。
- 不同地图SDK(高德、百度等)的API细节会有一点不同,但核心逻辑都是生成带额外图标的自定义Bitmap替换原Marker图标。
内容的提问来源于stack exchange,提问作者Limun
相关产品推荐
相关产品推荐

