2

我正在尝试在带有支持库的 Android 上使用 APIv2 在 GoogleMap 上绘制几个点。我有几个 SPOT 对象数组,包含所述点的纬度和经度。每次我想在地图上绘制点时,我都会调用以下方法:

public void drawSpotsFromArray(ArrayList<Spot> pSpots, int pZIndex) {

    for (int i=0; i<pSpots.size(); i++) {
        Spot lSpot = pSpots.get(i);

        double lDiameter = 10;

        CircleOptions lCircleOptions = new CircleOptions();
        lCircleOptions.center(new LatLng(lSpot.mLatitude, lSpot.mLongitude));
        lCircleOptions.radius(lDiameter);
        lCircleOptions.strokeColor(Color.BLACK);
        lCircleOptions.strokeWidth(5);
        lCircleOptions.fillColor(Color.WHITE);
        lCircleOptions.zIndex(pZIndex);

        mGoogleMap.addCircle(lCircleOptions);
    }
}

它只是绘制数组中包含的每个点。
现在,我的问题是这些数组非常大,导致内存过载。我画了大约 500 个圆圈(5 个 100 个圆圈的数组),所以应用程序变得非常慢。

有没有办法,而不是将每个圆圈绘制为单个叠加层,而是将每个点表绘制为单个叠加层?例如,将一个数组的 100 个圆圈绘制为一个叠加层,导致 5 个叠加层(5 个数组)而不是 500 个叠加层(数组的圆圈)。

如果是这样,它会更节省内存吗?
如果不是,那么在不消耗所有设备内存的情况下绘制这些圆圈的最佳做法是什么?

每次调用此方法时,我都会给出更高的 zIndex。我不知道这是否会以任何方式影响内存。谢谢您的帮助。

编辑:

好的,下面答案中的算法帮助我解决了我的问题,以及这个线程来绘制带有可绘制对象的地面覆盖: Ground Overlay

谢谢你的帮助!

4

2 回答 2

1

您可以尝试稍微不同的方法。仅当地图的该部分可见时才在地图上绘制点。每次相机位置移动时,您都需要再次调用它。

尝试这样的事情:

    public void drawSpotsFromArray(ArrayList<Spot> pSpots, int pZIndex) {

    LatLngBounds bounds = mGoogleMap.getProjection().getVisibleRegion().latLngBounds;

    for (int i = 0; i < pSpots.size(); i++) {
        Spot lSpot = pSpots.get(i);

        if (bounds.contains(new LatLng(lSpot.Latitude, lSpot.Longitude))) {
            double lDiameter = 10;

            CircleOptions lCircleOptions = new CircleOptions();
            lCircleOptions.center(new LatLng(lSpot.mLatitude,
                    lSpot.mLongitude));
            lCircleOptions.radius(lDiameter);
            lCircleOptions.strokeColor(Color.BLACK);
            lCircleOptions.strokeWidth(5);
            lCircleOptions.fillColor(Color.WHITE);
            lCircleOptions.zIndex(pZIndex);

            mGoogleMap.addCircle(lCircleOptions);

        }
    }
}
于 2013-10-15T22:10:15.173 回答
0

您看到延迟的原因是因为您试图在 UI 线程的地图上绘制 500 个元素,这肯定会减慢速度。

执行您想要的 IMO 的正确方法是获取地图投影并仅绘制当前可见的圆圈并保持布尔值或其他内容以指示圆圈已被绘制。这样做会降低应用程序的速度,因为它不会绘制所有内容,最终会导致所有项目都绘制在地图上(假设所有圆圈都是可见的),因此您最终不必再绘制任何内容。

于 2013-10-15T22:12:02.290 回答