安卓Google地图API v2中实现覆盖层的建议方式是什么?

9
在 Android Google Maps API 的原始版本中,使用以下代码实现叠加层非常容易:
List<Overlay> mapOverlays = mapView.getOverlays();
AlarmOverlay alarmOverlay = new AlarmOverlay();
mapOverlays.add(alarmOverlay);

在v1版本中,可以重写覆盖物的draw()方法并绘制矢量图形,重写覆盖物的onTouchEvent()方法并提供自定义控件等功能。

然而,在v2版本中,API参考文档中没有提到覆盖物的用例(标记和多边形是不够的),因此我不知道如何设计类似的自定义控件。有没有人有在v2中实现此功能的建议?


1
据我所知,现在你只需在地图上叠加一些东西(例如,在与地图相同的FrameLayout中添加其他“View”),并使用从GoogleMap的getProjection()获取的Projection进行绘制。 - CommonsWare
谢谢!我从 Cyril Mottier 的文章中得出了这样的印象,但在深入研究之前还想确认一下。感谢您的确认。 (顺便说一句,管理这样的覆盖层可能是您综合示例的一个很好的话题;-)) - gsysko
是的,特别是要想办法实现这样的覆盖层而不干扰触摸事件可能会很麻烦。就我个人而言,内置的标记/折线/多边形等应该已经足够满足我的需求了,还有一些地面瓦片的东西我还没有尝试过,所以希望相对较少的人需要使用全功能的覆盖层。我会把它加入到我的待办事项列表中,但在我开始处理之前可能还需要一段时间。 - CommonsWare
我能理解这种情况的局限性。不幸的是,出于各种原因(矢量绘图、更复杂的onTouchEvents等),我必须走这条路来开发我的应用程序。到目前为止,我遇到的问题是onCameraChangeListener反应不够灵敏,无法使我的图层保持同步移动 - 非常混乱! - gsysko
1个回答

3
如果您需要在地球表面上放置自己的图像,请使用GroundOverlay。方法addGroundOverlay添加此类图像。它使用GroundOverlayOptions,允许指定图像大小和位置(以纬度和经度表示),还可以使用Bitmap等其他选项之一的BitmapDescriptor作为图像源。因此,您可以创建一个新的位图,创建Canvas并在其中绘制。如果您需要绘制非常复杂的内容,那么这似乎是一个很好的方法,因为多边形和标记可能不够用。另外,旧的绘制Canvas代码可能可以重复使用。

我还没有进行足够的测试,以确定在更新位图后地图会在多快时间内得到更新。在最坏的情况下,可能需要移除地面叠加层,并添加新的地面叠加层。位图本身可能仍然可以被重用。

在顶部添加额外的组件可能会有问题,因为它必须支持缩放、移动和现在甚至是3D的地图。


谢谢您的评论。我认为您是正确的。我还没有时间确认您建议的实现方式,但我会尝试一下。 - gsysko
无论如何,您对在地图上叠加视图时遇到的问题是完全正确的。它运行得相当不错,但性能还不够好,并且在相机动画(例如缩放)方面表现不佳。触摸事件(如移动)可以通过覆盖包含地图的viewgroup中的onInterceptTouchEvent来处理,但是这样就无法考虑flings。非常感谢您的建议。 - gsysko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接