【问题标题】:Android-Maps-Extensions load marker images asynchronouslyAndroid-Maps-Extensions 异步加载标记图像
【发布时间】:2015-11-23 11:51:30
【问题描述】:

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

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

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

1) 设置地图聚类器

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

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

public EClusterOptionsProvider(Context context) {
    mClusterOptions = new ClusterOptions();
    mContext = context;
    mIconGenerator = new IconGenerator(context);

    // Inflate Layout
    View markerView = LayoutInflater.from(context).inflate(R.layout.map_marker, null);
    mImageView = (ImageView) markerView.findViewById(R.id.map_marker_image);
    mTextView = (TextView) markerView.findViewById(R.id.map_marker_text);

    // Setup Icon Generator
    mIconGenerator.setContentView(markerView);
}

public Bitmap createIcon(Bitmap bmp, String text) {
    mImageView.setImageBitmap(bmp);
    mTextView.setText(text);
    return mIconGenerator.makeIcon();
}

@Override
public ClusterOptions getClusterOptions(List<Marker> list) {
    // Get Bitmap from first marker
    Marker first = list.get(0);
    mClusterOptions.icon(BitmapDescriptorFactory.fromBitmap(mIconGenerator.makeIcon()));
    return mClusterOptions;
}

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

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

在一个侧节点上:我正在使用 Volley 异步 dl 图像。

【问题讨论】:

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


    【解决方案1】:

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

    我们将使用 Glide 加载图标,我发现它比 Picasso 更稳定。
    为要添加到地图的每个标记调用 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);
        }
    }
    

    【讨论】:

    • 谢谢,但我认为它仍在为地图上的每个标记加载图像。如果有一个包含 200 个图像的集群,此代码会为每个图像加载位图,其中一个图像(第一个)就足够了。
    • @AndreasKühntopf 当然,图像只会下载一次,然后 glide 将从缓存中获取它。但是没有人阻止你制作自己的缓存:)
    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 2011-10-04
    • 2015-03-07
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多