【问题标题】:android drawing multiple images into oneandroid将多个图像合二为一
【发布时间】: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?

标签: android bitmap tile


【解决方案1】:

参考答案

Android, canvas: How do I clear (delete contents of) a canvas (= bitmaps), living in a surfaceView?

我在绘制完每个位图后调用了这个:

Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)

我说的问题是 TileSource 类中的画布使用最新的要绘制的图块,而不是每次都绘制请求的图块。上面的行强制立即应用画布的所有更改(似乎如此)

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2015-01-08
    • 2019-07-08
    相关资源
    最近更新 更多