如何更新TileOverlay没有闪烁?

我有一些dynamic瓷砖内容显示在地图上(具体来说,天气图像 – 雷达,卫星,温度等)。 我正在使用适用于Android v2的Google Maps API。

我遇到的问题是显然更新平铺图像的唯一方法(即当新数据到达时,或者帧在时间推移animation中前进时)是调用TileOverlay.clearImageCache。 不幸的是,当我这样做的时候,瓷砖叠加层闪烁了片刻。 这是因为clearImageCache会立即从显示中删除现有的平铺图像,但在解码和显示新的平铺图像之前会有一段延迟。

我正在使用自定义的TileProvidercaching平铺图像,而不是每次从服务器获取它们。 但是,即使只是提供caching切片(也就是说我的TileProvider.getTile实现不会造成太大的延迟),仍然有足够的延迟,用户可以看到闪烁。

有谁知道一种方法来避免这种闪烁? 有什么办法可以双重缓冲瓦片覆盖? 我试图用两个贴在地图上的TileOverlay对其进行双缓冲,其中一个是不可见的。 但是,即使在我调用clearImageCache之后,不可见的TileOverlay也不会开始从TileProvider中获取任何图块。

是否有可能加载即将到来的瓷砖图像,但有可见性设置为false? Tile.setVisible(false);

然后当你想改变(即将到来的瓷砖已经加载后),设置即将到来的瓷砖是可见的,当前瓷砖是不可见的?

 CurrentTile.setVisible(false); NewTile.setVisible(true); 

这样,所有更改都发生在同一个渲染框架内,并且没有延迟等待caching的图像加载。

一个相当不错的解决scheme是从TileProvider中分离磁贴下载和caching。 这样,您可以完全控制下载的时间,只需在下载全部内容后replacebyte []引用即可。

这可能会更复杂一些,因为你必须照顾当前的可见区域,并放大缩小而不是全部下载,但只有那些可见的。

编辑

testing以下代码:

 try { InputStream is = getAssets().open("tile1.jpg"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b = is.read(); while (b != -1) { baos.write(b); b = is.read(); } byte[] array = baos.toByteArray(); cache = new Tile(256, 256, array); is = getAssets().open("tile2.jpg"); baos = new ByteArrayOutputStream(); b = is.read(); while (b != -1) { baos.write(b); b = is.read(); } array = baos.toByteArray(); nextCache = new Tile(256, 256, array); } catch (IOException ex) { Log.e("tag", "error reading tiles", ex); } tileOverlay = map.addTileOverlay(new TileOverlayOptions().tileProvider(new TileProvider() { @Override public Tile getTile(int x, int y, int zoom) { return cache; } })); 

以后的某个地方

 Tile temp = cache; cache = nextCache; nextCache = temp; tileOverlay.clearTileCache(); 

“最快”的可能的代码仍然失败。

如果您无法切换到GroundOverlay或标记,另一个想法是尝试使用第三方地图图块,当前的天气图块在下方的上方和下方的图块中,以便它们可以在几秒钟后加载并切换它们(使用zOrder)。