首页 > 解决方案 > 在 java android google map 中显示和更新标记的图标

问题描述

我以 github 中的代码(这不是我的代码)为例 https://github.com/mitchtabian/Google-Maps-2018/tree/displaying-trip-duration-of-polylines-end

这是我的问题:

我有两个问题:

  1. onBeforeClusterItemRendered()方法不显示图像。如果我像原始示例一样使用资源中的图像,那么它可以工作。
  2. setUpdateMarker()方法仅在一个标记上更改两个图像,而不是在每个标记上显示图像。

    @Override protected void onBeforeClusterItemRendered(ClusterMarker item, 
    MarkerOptions markerOptions) {
        super.onBeforeClusterItemRendered(item, markerOptions);
        Bitmap mIcon = null ;
        try {
            InputStream in = new URL(item.getIconPath()).openStream();
            mIcon = BitmapFactory.decodeStream(in);
            imageView.setImageBitmap(mIcon);
            Bitmap icon = iconGenerator.makeIcon();
            markerOptions.icon(
               BitmapDescriptorFactory.fromBitmap(icon)).title(item.getTitle());
        } catch (Exception e) {
            e.printStackTrace();
        } 
    } 
    
    public void setUpdateMarker(ClusterMarker clusterMarker) {
        marker = getMarker(clusterMarker);
        if (marker != null) {
            marker.setPosition(clusterMarker.getPosition());
            new DownloadImageTask().execute(clusterMarker.getIconPath());
        } 
    }
    
    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
    
        @Override
        protected Bitmap doInBackground(String... urls) {
            Bitmap mIcon = null;
            try {
                InputStream in = new URL(urls[0]).openStream();
                mIcon = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return mIcon;
        }
    
        @Override
        protected void onPostExecute(Bitmap result) {
            if (marker!=null && result != null) {
                Bitmap resizedBitmap = Bitmap.createScaledBitmap(result, 
                    markerWidth, 
                    markerHeight,
                    false);
                marker.setIcon(
                    BitmapDescriptorFactory.fromBitmap(resizedBitmap));
            }
        } 
    }
    

更新:我也展示了这个类的构造函数:

public class MyClusterManagerRenderer extends DefaultClusterRenderer<ClusterMarker> {
    private static final String TAG = " ClusterManagerRenderer";
    private final IconGenerator iconGenerator;
    private final ImageView imageView;
    private final int markerWidth;
    private final int markerHeight;
    private final int padding;
    private Marker marker;


    public MyClusterManagerRenderer(Context context, GoogleMap googleMap,
                                    ClusterManager<ClusterMarker> clusterManager) {

        super(context, googleMap, clusterManager);

        // initialize cluster item icon generator
        iconGenerator = new IconGenerator(context.getApplicationContext());
        imageView = new ImageView(context.getApplicationContext());
        markerWidth = (int) context.getResources().getDimension(R.dimen.custom_marker_image);
        markerHeight = (int) context.getResources().getDimension(R.dimen.custom_marker_image);
        imageView.setLayoutParams(new ViewGroup.LayoutParams(markerWidth, markerHeight));
        padding = (int) context.getResources().getDimension(R.dimen.custom_marker_padding);
        imageView.setPadding(padding, padding, padding, padding);
        iconGenerator.setContentView(imageView);

    }

标签: javaandroidgoogle-maps

解决方案


您可以在 onClusterItemRendered() 方法中使用您的方法。看看这个答案https://stackoverflow.com/a/34029984/7917629

@Override
    protected void onClusterItemRendered(ClusterMarker item, final Marker marker) {
        String imageUrl = item.getImageUri();

        // here you can call your background task
        // or some other option like Glide
        // you put your icon as: 
        // marker.setIcon(BitmapDescriptorFactory.fromBitmap(resizedBitmap));
    }

------在此处更新如何使用 glide(我的版本 4.7.1)

   @Override
    protected void onClusterItemRendered(EventMarker clusterItem, final Marker marker) {
        String imageUrl = clusterItem.getImageUri();

        if (imageView != null && imageUrl != null && !imageUrl.isEmpty()) {
            Glide.with(mContext.getApplicationContext())
                    .load(imageUrl)
                    .apply(new RequestOptions()
                            .optionalCircleCrop()
                            .placeholder(R.mipmap.default_event_cover_rounded)
                            .error(R.mipmap.default_event_cover_rounded)
                            .diskCacheStrategy(DiskCacheStrategy.ALL))
                    .into(new SimpleTarget<Drawable>() {
                        @Override
                        public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                            imageView.setImageDrawable(resource);
                            Bitmap icon = iconGenerator.makeIcon();
                            try {
                                marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                            } catch (Exception e) {
                                Log.d("TAG", "onResourceReady: " + e.getMessage());
                            }
                        }
                    });
        }
    }

这是您如何更新图标的方式:Map<String, Marker> markers在您的 CustomClusterRender 顶部定义一些,在构造函数中对其进行初始化。在你这个之后用一些键添加你的标记marker.setIcon。像markers.put(clusterItem.getId(), marker);您的自定义集群一样添加必须具有唯一 ID。你的方法将是

public void updateMarker(final String id, String imgUrl) {
        if (markers.size() > 0) {
            if (iconImage != null) {
                Glide.with(mContext.getApplicationContext())
                        .load(imgUrl)
                        .apply(new RequestOptions()
                                .optionalCircleCrop()
                                .placeholder(R.mipmap.default_event_cover_rounded)
                                .error(R.mipmap.default_event_cover_rounded)
                                .diskCacheStrategy(DiskCacheStrategy.ALL))
                        .into(new SimpleTarget<Drawable>() {
                            @Override
                            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                                iconImage.setImageDrawable(resource);
                                Bitmap icon = iconGenerator.makeIcon();
                                try {
                                    markers.get(id).setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                                } catch (Exception e) {
                                    Log.d("TAG_SNAP", "onResourceReady: " + e.getMessage() + markers.get(id).getTitle());
                                }
                            }
                        });
            }
        }

推荐阅读