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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:57:00