我有一个应用程序,用户可以在其中加载谷歌地图上的图像。这是为 2.3 开发的,所以有一个 MapActivity、一个 MapView 和我的自定义 Overlay 类来显示图像。在覆盖类绘制方法中,我每次都重新计算一个矩阵,因此图像得到正确的大小和位置。我还有一个校准模式,用户可以通过拖动参考点来调整图像。
我将向应用程序添加一些功能,并且我想从一些更新开始,例如使用片段。用 MapFragment 替换 MapActivity 会带来一些问题,因为似乎不支持您可以自己实现绘图的叠加层。看来我将不得不使用 GroundOverlays 或 TileOverlay。(如果我错了,请纠正我。)
这些似乎都不支持在添加叠加层后对其进行任何修改,因此图像的校准将不起作用。我对这部分的计划是在 MapFragment 顶部放置一个普通的 ImageView 用于校准模式。(这将隐藏所有标记,但这在校准期间并不重要。)为此,我需要两件事: * 接收影响校准点的所有触摸事件并转发其余的以允许正常缩放等 * 随时检测位置/旋转/缩放级别发生变化,因此我可以调整图像。问题#1:我可以期待任何重大问题吗?
然后我必须决定是否首选 GroundOverlays 或 TileOverlay。
GroundOverlay:这似乎需要最少的工作,因为它仍然会加载整个图像。我还认为它会自动处理屏幕方向变化等事情。问题 #2:GroundOverlay 能否很好地处理大图像(最大 2000*2000 像素)?是否有任何涉及图像的复制?由于图像太大,我无法在内存中复制一份以上。
TileOverlay:从某种意义上说,这似乎是一个更专业的解决方案,因为它只使用实际需要的部分,并且我稍后可以介绍对同时使用多个地图图像源的支持。我可能必须提前生成图块并为每个图块保存一个单独的文件,将其保存在内存中并按需创建图块可能会占用大量内存。(或者也许我可以创建一个单独的 tile 服务,但这似乎有点脏。) 问题 #3:是否可以控制 tile 缓存将使用多少内存?是否适用通常的限制?我不想仅仅因为缓存占用了我允许使用的大部分内存而在应用程序的其他地方耗尽内存。问题 #4:文档说“请注意,与其他叠加层不同,如果重新创建地图,因此这意味着必须再次读取文件,从而导致明显的加载延迟。有什么好办法解决这个问题吗?问题5:当getTile被调用,我返回null(因为tile保存在一个文件中,我不想在读取的时候阻塞ui线程),需要多长时间才能再次请求它?(似乎没有办法手动加载单个图块。) 问题 6:如何确定一个图块图像的良好图像分辨率(关于性能和质量)?因此这意味着必须再次读取文件,从而导致明显的加载延迟。有什么好办法解决这个问题吗?问题5:当getTile被调用,我返回null(因为tile保存在一个文件中,我不想在读取的时候阻塞ui线程),需要多长时间才能再次请求它?(似乎没有办法手动加载单个图块。) 问题 6:如何确定一个图块图像的良好图像分辨率(关于性能和质量)?