我正在实现一个基于openstreetmap图块的地图查看器。每个瓷砖具有相同的尺寸 256x256像素。
当一个图块无法绘制时,我会看到它的“父”尺寸(一个来自较低的缩放)和 切割与我需要的瓷砖相对应的区域。
这是preudocode:
class TileDrawer:
Canvas canvas;
class TileSource:
Canvas canvas;
Bitmap placeHolder;
canvas.setBitmap(placeHolder);
Bitmap getTile(x, y, z):
if x,y,z in cache:
return cache[x,y,z];
else if parent in cache:
canvas.drawBitmap(parent, tileRect, parentRect);
return placeHolder;
else
return null;
drawTiles(tileSource):
for tileXYZ in tilesXYZ:
tile = tileSource.getTile(tileXYZ)
canvas.drawBitmap(tile)
问题是在绘制屏幕后使用相同的绘图平铺。所以我怀疑
代码canvas.drawTile
没有立即绘制,因此显示的图块是最后调用getTile
的图块。作为一项实验,我在返回getTile
之前复制了位图,一切都按需要运行。
任何人都可以确认这种行为吗?如何在不必保留一堆磁贴占位符且不一直复制位图的情况下避免这种情况?
我猜这种行为等同于修改循环中的成员位图,然后在每次修改后调用canvas.drawBitmap。问题是只绘制了最终的修改,而不是之间的修改。
答案 0 :(得分:0)
请参阅此处的答案
Android, canvas: How do I clear (delete contents of) a canvas (= bitmaps), living in a surfaceView?
我在绘制每个位图后调用了它:
Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
我说的问题是TileSource类中的画布使用了最新的tile来绘制,而不是每次都绘制所请求的tile。上面的行强制立即应用画布的所有更改(似乎是这样)