4

我们正在将应用程序从 v1 Maps API 移植到 v2 API,并且遇到了标记问题。

我们需要指向特定地理方向的标记。在 V1 中,我们可以在绘制时构建指向正确方向的位图,但在 V2 中,标记位图不能更改。

我不确定最好的方法是在地图旋转时销毁并重新构建所有标记(这听起来像是性能问题),还是尝试自己绘制它们。这可以通过 TileOverlay 或通过我们坐在地图顶部的我们自己的视图。

我真的不喜欢这些方法中的任何一种。有人试过吗?

更新:

我已经尝试通过我们自己的视图进行绘图,但是在拖动地图时这太滞后了。

我现在正在销毁并重新创建标记,但这(正如预期的那样)是一个性能问题,需要大约 2000 毫秒来更新 60 个标记。

4

4 回答 4

5

大家好消息!Google 为 Maps API 添加了轮换功能,因此我们不必再推出自己的实现了。

他们还添加了平面标记,我想这与原始问题更相关。扁平标记将始终保持其最初在地图上绘制的方向:https ://developers.google.com/maps/documentation/android/marker#flatten_a_marker

唯一的要求是您参考最新版本的 Google Play 服务。

于 2013-09-30T14:10:34.677 回答
0

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

如果您需要自定义标记,您可以创建一个实现InfoWindowAdapter 并使用该实现,例如 mMap.setInfoWindowAdapter(new CustomInfoWindowAdapter());

这是InfoWindowAdapter的文档

于 2013-01-09T12:55:52.967 回答
0

我有一个类似的问题,我有需要旋转的标记。我的解决方案是让标记所代表的对象负责生成标记。我在对象中有一些方法,如下所示:

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 个图像。它是一个静态类,只接受标题并返回我映射到该范围的图像。

于 2013-08-28T14:56:01.107 回答
0

我还在为新 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);
    }
}

除了创建和添加自定义标记外,您看到的是我将标记保存在 a 中HashMap,因此我不必一直销毁和创建它们。当涉及到缩放和决定显示哪些标记时,我首先将所有标记设置为不可见,然后调用addMarker()我想要显示的标记,以及我已经在其中的标记HashMap再次显示。

我希望这对你有所帮助。我对新的 API 有点复杂的感觉......

于 2013-01-18T10:03:46.187 回答