Android上内存高效的谷歌地图绘制

时间:2013-10-15 21:56:35

标签: android performance google-maps memory overlay

我正在尝试使用支持库在Android上使用API​​v2在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。我不知道这是否会以任何方式影响记忆。 谢谢你的帮助。

修改

好吧,下面的答案中的算法帮助我解决了我的问题,同时这个线程绘制了一个带有drawable的地面叠加层: Ground Overlay

感谢您的帮助!

2 个答案:

答案 0 :(得分: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);

        }
    }
}

答案 1 :(得分:0)

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

做你想做的事情的正确方法IMO将获得地图投影,只绘制当前时间可见的圆圈,并保留一个布尔值或表示圆圈被绘制的东西。这样做会降低应用程序的速度,因为它不会绘制所有内容,最终会导致所有项目都在地图上绘制(假设所有圆圈都是可见的),因此您最终不必再绘制任何内容。