如何在osmdroid中绘制雷达扫描动画,设置RadialGradient填充不生效怎么办
问题原因
osmdroid自带的Polygon组件在执行绘制逻辑时,会默认重置fillPaint的大部分自定义配置,你预先设置的RadialGradient shader会被默认配置覆盖,导致不生效。同时你当前的中心坐标是初始化时一次性计算的,当地图发生缩放、平移操作时,地理点对应的屏幕像素坐标会发生变化,也会导致渐变位置错位、看起来没有生效。
解决方法
你需要自定义类继承Polygon,重写其draw方法,在每次绘制前动态计算坐标并设置shader,示例实现如下:
class GradientPolygon(private val centerPoint: GeoPoint, private val radius: Int) : Polygon() { override fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) { if (shadow) return // 每次绘制前重新计算中心的屏幕像素坐标 val centerPixel = mapView.projection.toPixels(centerPoint, null) val gradient = RadialGradient( centerPixel.x.toFloat(), centerPixel.y.toFloat(), radius.toFloat(), Color.GREEN, Color.RED, Shader.TileMode.MIRROR ) // 动态设置fillPaint的shader fillPaint.shader = gradient fillPaint.isAntiAlias = true // 调用父类绘制逻辑 super.draw(canvas, mapView, shadow) // 绘制完成后清空shader,避免影响下次绘制 fillPaint.shader = null } }
使用方式
替换你原来的Polygon初始化逻辑即可:
val polygon = GradientPolygon(pointCenter, radius) polygon.points = points mapView.overlayManager.add(polygon) // 如果需要做雷达扫描动画,每次动画参数更新后调用mapView.invalidate()触发重绘即可
额外注意事项
- 如果需要实现雷达扫描的旋转效果,可以通过给Canvas设置旋转矩阵实现,同样可以写在自定义draw方法中,旋转中心设置为计算得到的
centerPixel坐标即可 - 每次修改多边形的点位、半径、渐变颜色等参数后,调用
mapView.invalidate()即可触发重绘更新效果
内容的提问来源于stack exchange,提问作者charon
相关产品推荐
相关产品推荐

