Android Google Maps自定义TileProvider天气瓦片无闪烁更新问题求助
Google Maps自定义时间序列瓦片无闪烁切换方案
核心实现逻辑
你之前尝试的单TileOverlay切换方案之所以会闪烁,本质是旧瓦片销毁和新瓦片加载存在时间差,双TileOverlay预加载方案可以完全解决这个问题,也是主流天气应用的通用实现:
- 维护两个仅切换可见性的TileOverlay实例,不需要每次销毁重建
- 每次切换时间帧时,先给隐藏的TileOverlay设置对应时间的瓦片Provider,等瓦片完全加载完成后,再交换两个Overlay的可见性
- 所有瓦片统一走二级缓存,避免重复加载耗时
具体实现步骤
- 初始化阶段创建两个TileOverlay,都设置
setFadeIn(false),默认仅显示第一个Overlay,第二个设置为不可见 - 提前预加载当前帧、前后相邻时间帧的瓦片到内存缓存,SeekBar拖动过程中优先预加载靠近拖动位置的时间帧瓦片
- 时间切换触发逻辑:
- 先判断当前隐藏的TileOverlay是否已经加载了目标时间的瓦片,是则直接交换两个Overlay的可见性
- 如果未加载,给隐藏的TileOverlay设置对应目标时间的瓦片Provider,通过TileProvider的getTile回调计数对比当前视野内总瓦片数,判断瓦片是否全部加载完成
- 待视野内所有瓦片加载完成后,调用
setVisible()交换两个Overlay的可见状态,整个切换过程无闪烁
优化点
- 全局维护瓦片缓存,key规则为
缩放级别/x坐标/y坐标/时间戳,相同瓦片直接返回缓存对象,无需重复解码或请求 - 快速拖动SeekBar时添加防抖处理,仅加载用户停止拖动后最终位置的时间帧,避免无效资源占用
- 如果需要实现自动播放动画,提前预加载后续2-3帧的所有瓦片到内存,实现无卡顿切换
代码示例(Kotlin)
// 全局瓦片缓存,可根据需要调整缓存大小 val tileCache = LruCache<String, Tile>(2048) // 双TileOverlay实例 lateinit var activeOverlay: TileOverlay lateinit var pendingOverlay: TileOverlay // 初始化方法,在地图加载完成后调用 fun initTileOverlays(googleMap: GoogleMap) { val baseOptions = TileOverlayOptions() .fadeIn(false) .zIndex(1f) // 确保瓦片在地图上层 activeOverlay = googleMap.addTileOverlay(baseOptions.visible(true))!! pendingOverlay = googleMap.addTileOverlay(baseOptions.visible(false))!! } // 切换雷达时间帧方法 fun switchRadarFrame(targetTime: Long) { // 待加载层已经是目标时间,直接切换可见性 if (pendingOverlay.tag == targetTime) { activeOverlay.isVisible = false pendingOverlay.isVisible = true // 交换两个实例的引用 val temp = activeOverlay activeOverlay = pendingOverlay pendingOverlay = temp return } // 给待加载层设置新的瓦片Provider pendingOverlay.setTileProvider(object : TileProvider { override fun getTile(x: Int, y: Int, zoom: Int): Tile? { val tileKey = "${zoom}/${x}/${y}/${targetTime}" // 优先读缓存,没有的话走磁盘/网络加载 return tileCache.get(tileKey) ?: loadTileFromSource(tileKey) } }) pendingOverlay.tag = targetTime // 此处可添加瓦片加载完成监听逻辑,加载完成后再执行可见性交换 } // 瓦片加载方法,自己实现从磁盘或网络加载逻辑,加载完成后存入缓存 fun loadTileFromSource(tileKey: String): Tile? { // 省略实际加载逻辑 }
内容的提问来源于stack exchange,提问作者Pepa Zapletal
相关产品推荐
相关产品推荐

