如何通过代码动态修改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) } }
关键说明
- 类型转换:因为你的资源是Shape Drawable,必须强转为
ShapeDrawable才能访问其Paint属性;若使用真正的Vector Drawable,需要通过VectorDrawableCompat并修改其内部路径的颜色。 - mutate():调用该方法确保修改仅作用于当前Drawable实例,不会影响其他复用该资源的地方。
- 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
相关产品推荐
相关产品推荐

