Android-Maps-Extensions异步加载标记图像

时间:2015-08-28 18:21:17

标签: android google-maps google-maps-markers android-maps-v2 android-maps-extensions

我正在尝试将图片(从服务器下载)显示为Google地图上的地图标记。我正在使用Android-Maps-Extensions,因为我对Google Map-Utils的性能不满意。

现在我想知道如何与AME异步加载地图标记图像。如果图像不是群集,则任务是显示图像本身。 如果它是一个集群,我想显示第一个标记的图像和集群中的元素数。

到目前为止,我已经完成了以下工作:

1)设置Map Clusterer

PageDetail

2)创建群集选项提供程序

private void setupMapClusterer() {
    mClusterOptions = new EClusterOptionsProvider(getContext());
    ClusteringSettings clusteringSettings = new ClusteringSettings();
    clusteringSettings.addMarkersDynamically(true);
    clusteringSettings.clusterOptionsProvider(mClusterOptions);
    mMap.setClustering(clusteringSettings);
}

这给了我一张地图,其中集群有我的自定义视图(这是正确的),但我无法弄清楚在哪里下载图像以及如何将它们放入单个标记,尤其是集群。

当然我不想提前下载所有图像(我们说的是500多张)图像。

在sidenode上:我正在使用Volley异步调整图像。

1 个答案:

答案 0 :(得分:3)

我创建了使用聚类和加载标记异步的简单示例 希望你在这里找到一些有用的。 https://github.com/pengrad/android-maps-async-markers

我们将使用Glide加载图标,我发现它比毕加索更稳定 为要添加到地图的每个标记调用loadIconMarker。

MarkerOptions markerOptions = ...
// you should pass some icon before new loaded, or leave default one
//markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.default_marker));
Marker marker = mMap.addMarker(markerOptions);
loadMarkerIcon(marker);


private void loadMarkerIcon(final Marker marker) {
    Glide.with(this).load("http://www.myiconfinder.com/uploads/iconsets/256-256-a5485b563efc4511e0cd8bd04ad0fe9e.png")
            .asBitmap().fitCenter().into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) {
            BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(bitmap);
            marker.setIcon(icon);
        }
    });
}

创建ClusterIcon有点困难。这是我的ClusterOptionsProvider 我使用基本位图R.drawable.m1并在其上添加表示群集中标记数量的文本。

public class ClusterIconProvider implements ClusterOptionsProvider {

    Resources resources;
    Paint paint;
    Bitmap base;

    public ClusterIconProvider(Resources resources) {
        this.resources = resources;

        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        paint.setTextAlign(Paint.Align.CENTER);
        paint.setTextSize(15);

        base = BitmapFactory.decodeResource(resources, R.drawable.m1);
    }

    @Override
    public ClusterOptions getClusterOptions(List<Marker> list) {
        Bitmap bitmap = base.copy(Bitmap.Config.ARGB_8888, true);

        Rect bounds = new Rect();
        String text = String.valueOf(list.size());
        paint.getTextBounds(text, 0, text.length(), bounds);
        float x = bitmap.getWidth() / 2.0f;
        float y = (bitmap.getHeight() - bounds.height()) / 2.0f - bounds.top;

        Canvas canvas = new Canvas(bitmap);
        canvas.drawText(text, x, y, paint);
        BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(bitmap);

        return new ClusterOptions().anchor(0.5f, 0.5f).icon(icon);
    }
}