【发布时间】:2014-05-05 22:43:14
【问题描述】:
我正在实现一个基于 openstreetmap 图块的地图查看器。每个瓷砖都有相同的大小 256x256 像素。
当无法绘制图块时,我会查看其“父级”大小(来自较低缩放的一个),然后 剪切我需要的瓦片对应的区域。
这是前置代码:
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 之前复制了位图,一切都按需要进行。
谁能确认这种行为?我怎样才能避免这种情况,而不必保留一堆 tile 占位符,也不必一直复制位图?
澄清
我猜这个行为相当于在循环中修改一个成员位图,然后在每次修改后调用canvas.drawBitmap。问题是只绘制了最后的修改,而不是中间的修改。
【问题讨论】:
-
不知道你在说什么
-
@pskink java 通过引用传递对象,所以当你说 canvas.drawTile(tile) 时,你传递了对 placeHolder 位图的引用。如果调用 canvas.drawTile(tile) 没有立即绘制(可能通过将 tile 对象存储在某处),在循环结束时
for tileXYZ in tilesXYZ:,TileDrawer 的画布将有一堆对 placeHolder 的引用,并将绘制相同的每个图块的东西 -
好吧,也许我错了,但我们是在谈论 android 吗? Canvas.drawTile 是什么意思?
-
@pskink 很抱歉造成混淆。是的,我们正在谈论安卓。我的意思是
canvas.drawBitmap -
好吧,你为什么要使用canvas.setBitmap?