Android Maps API v2 - 标记旋转的方法?

4
我们正在将一个应用程序从v1地图API迁移到v2 API,并且在处理标记时遇到了麻烦。
我们需要指向特定地理方向的标记。在V1中,我们可以在绘制时构建指向正确方向的位图,但在V2中,标记位图不能更改。
我不确定最好的方法是当地图旋转时销毁并重建所有标记(这听起来像是性能问题),还是尝试自己绘制它们。这可以通过TileOverlay或我们自己放置在地图顶部的视图来实现。
我真的不喜欢任何一种方法。有人尝试过吗?
更新:
我已经尝试通过我们自己的视图进行绘制,但当地图被拖动时效果非常不好。
现在我正在销毁和重新创建标记,但这是一个(预料中的)性能问题,更新60个标记需要~2000毫秒。
4个回答

5

1

我也正在为新API重写我的应用程序(Runbot),并且不得不想出如何创建代表里程碑(如1公里,2公里等)的自定义标记,以及如何根据缩放级别显示或不显示所有标记。 我有一个自定义的可绘制对象,我在v1 API中使用它,现在我用它来渲染标记(Position是我自己的一个类,它保存位置和其他信息;这里需要的只是它的LatLng属性):

private void addMarker(Position p, MilestoneDrawable milestone) {
    if (mMarkers.containsKey(p)) {
        mMarkers.get(p).setVisible(true);
    } else {
        Marker m = mMap.addMarker(new MarkerOptions()
            .position(p.latLng)
            .icon(BitmapDescriptorFactory.fromBitmap(Util.drawableToBitmap(milestone)))
            .anchor(0.5f, 1.0f) // bottom center
            );
        mMarkers.put(p, m);
    }
}

除了创建和添加自定义标记之外,您看到的是我将标记保存在HashMap中,这样我就不必一直销毁和创建它们。当涉及缩放和决定要显示哪些标记时,我首先将所有标记设置为不可见,然后调用addMarker()来显示我想要显示的标记,并且对于那些我已经在HashMap中的标记,我只需再次使其可见即可。

希望这能对您有所帮助。我对新API有些复杂的感觉...


1
我曾遇到类似的问题,需要旋转标记。我的解决方案是让标记所代表的对象负责生成标记。我在对象中编写了几个方法,如下所示:
protected Marker getMarker(GoogleMap map) {
    if (this.marker == null) {
        marker = map.addMarker(new MarkerOptions().position(location).
            icon(BitmapDescriptorFactory.fromBitmap(BusMarkerImageFactory.
            getMarkerIcon(heading))));
    }
    return marker;
}

protected void updateMarker(GoogleMap map) {
    if (marker != null) {
        rotateIcon();
        marker.setPosition(location);
    } else {
        getMarker(map);
    }

private void rotateIcon() {
    marker.setIcon(BitmapDescriptorFactory.
        fromBitmap(BusMarkerImageFactory.getMarkerIcon(heading)));
}

这是一个绘制公交车的系统,标记指向它们行驶的方向。当然,你的代码会有所不同,但概念非常相似。你不需要重新构建整个标记,只需在某个地方保留对它的引用,然后简单地重置图标。
当然,为了进行微小更改而绘制所有这些位图会消耗内存。我在(错误命名的)BusMarkerImageFactory 中使用了享元模式来保留16个可能的方向范围的16个图像。它是一个静态类,只需输入方向即可返回我映射到该范围的图像。

0

你不能使用 addMarker(new MarkerOptions()) 方法吗?

如果你需要自定义标记,你可以创建一个 InfoWindowAdapter 的实现,并像这样使用该实现:mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());

这里是 InfoWindowAdapter 的文档。


我的错,我理解错了,但我认为标记位图可以更改,请检查Google Maps v2的示例代码,检查MarkerDemoActivity,他们在那里有自定义标记,此外,如果您不想在视图中更改任何内容,则可以覆盖onConfigurationChanged以避免重新绘制地图。这次我理解正确了吗? - Moh Sakkijha
不,MarkerDemoActivity仅在addMarkersToMap中设置标记图标,当它创建标记时。它从不更改标记图标。 - Richard Sewell
@RichardSewell 我不知道如何旋转标记,但是您可以使用 bearing 旋转指向特定位置的图像(箭头)。请参考这个问题:https://dev59.com/NW_Xa4cB1Zd3GeqP2pa0 - AlexAndro

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