You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码动态修改Vector Drawable的描边色与填充色?

动态修改地图标记Shape Drawable的描边与填充色

你当前提供的「vector」代码实际是Shape Drawable(而非Vector Drawable),原方法仅通过setTint()统一着色,无法分别控制描边和填充色。要实现分别修改两种颜色,需要直接操作ShapeDrawable的Paint属性,以下是修正后的实现:

修正后的工具函数

private fun bitmapDescriptorFromShape(context: Context, shapeResId: Int, strokeColor: Int, fillColor: Int): BitmapDescriptor? {
    // 将Drawable强转为ShapeDrawable,确保类型匹配
    val shapeDrawable = ContextCompat.getDrawable(context, shapeResId) as? ShapeDrawable ?: return null
    
    return shapeDrawable.mutate().let { drawable ->
        // 修改填充色
        drawable.paint.color = fillColor
        // 保留原xml中的描边宽度(4dp),转换为像素值
        val strokeWidth = TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            4f,
            context.resources.displayMetrics
        )
        // 设置描边属性
        drawable.paint.apply {
            this.strokeWidth = strokeWidth
            this.strokeColor = strokeColor
            this.style = Paint.Style.STROKE_AND_FILL // 确保填充和描边都生效
        }

        // 设定Drawable绘制边界
        drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
        
        // 绘制到Bitmap并转为地图可用的BitmapDescriptor
        val bitmap = Bitmap.createBitmap(
            drawable.intrinsicWidth,
            drawable.intrinsicHeight,
            Bitmap.Config.ARGB_8888
        )
        val canvas = Canvas(bitmap)
        drawable.draw(canvas)
        BitmapDescriptorFactory.fromBitmap(bitmap)
    }
}

关键说明

  1. 类型转换:因为你的资源是Shape Drawable,必须强转为ShapeDrawable才能访问其Paint属性;若使用真正的Vector Drawable,需要通过VectorDrawableCompat并修改其内部路径的颜色。
  2. mutate():调用该方法确保修改仅作用于当前Drawable实例,不会影响其他复用该资源的地方。
  3. Paint属性控制:通过paint.color设置填充色,paint.strokeColor和paint.strokeWidth设置描边的颜色与宽度,同时指定STROKE_AND_FILL风格保证两种效果都能显示。

使用示例

// 生成红色描边、白色填充的地图标记
val markerDescriptor = bitmapDescriptorFromShape(
    context = this,
    shapeResId = R.drawable.your_shape_resource,
    strokeColor = Color.RED,
    fillColor = Color.WHITE
)
// 将descriptor设置给地图标记
val marker = MarkerOptions().icon(markerDescriptor)

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:27:39