有效地为地图标记创建位图

时间:2014-04-15 00:05:56

标签: android bitmap google-maps-android-api-2

我正在使用Android谷歌地图v2,我正在创建地图标记并分配位图。我从资产目录中获取位图。我从资产中获取它们的原因是我用来查找“正确”图标的路径是动态的。

我的问题是我应该保存底层位图,以便我可以一次又一次地重复使用它。我读: http://developer.android.com/training/displaying-bitmaps/manage-memory.html

但坦率地说,很多大样本项目都在我头上。

每次我需要将其传递给用于创建的标记时,我是否应该重新创建位图,或者我应该将每个位图(最多限制)读入内存并保存以供重复使用。

无论如何我都不会在地图上绘制每个人。

示例:我在地图上有300个标记,有20个不同的可能位图。 I.E.大约15%是相同的标记图标。

1 个答案:

答案 0 :(得分:4)

由于位图解码是非常昂贵的操作,我肯定会建议使用位图缓存。特别是在您的情况下,独特位图的数量远远小于地图上标记的数量。基于简单[LruCache][1]的内存缓存可以正常工作。您只需要注意用于缓存的内存量。

以下是如何实现内存缓存的一个很好的示例: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

跟进

只是想到这一点,你可以在这里做得更好。您可以为您拥有的每个唯一位图缓存BitmapDescriptor,而不是缓存位图。通过这种方式,您可以避免每次需要创建标记时调用BitmapDescriptorFactory来获得额外的性能

<强>更新

这就是我的意思:

LruCache<String, BitmapDescriptor> cache;

private void initCache()
{
    //Use 1/8 of available memory
    cache = new LruCache<String, BitmapDescriptor>((int)(Runtime.getRuntime().maxMemory() / 1024 / 8));
}

private void addMarker(LatLng position, String assetPath)
{
    MarkerOptions opts = new MarkerOptions();
    opts.icon(getBitmapDescriptor(assetPath));
    opts.position(position);
    mMap.addMarker(opts);
}

private BitmapDescriptor getBitmapDescriptor(String path) {
    BitmapDescriptor result = cache.get(path);
    if (result == null) {
        result = BitmapDescriptorFactory.fromAsset(path);
        cache.put(path, result);
    }

    return result;
}