【问题标题】:Show and update icon of marker in java android google map在 java android google map 中显示和更新标记的图标
【发布时间】:2019-04-08 19:53:53
【问题描述】:

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

这是我的问题:

  • 假设有一些用户(标记)。
  • 我想把marker的图标换成网上的另一张图片,但是不行。

我有两个问题:

  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);

    }

【问题讨论】:

    标签: java android google-maps


    【解决方案1】:

    您可以在 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());
                                }
                            }
                        });
            }
        }
    

    您可以通过以下方式更新您的图标: 在 CustomClusterRender 顶部定义一些 Map&lt;String, Marker&gt; markers,在构造函数中对其进行初始化。在你这个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());
                                    }
                                }
                            });
                }
            }
    

    【讨论】:

    • @Alex 在 onClusterItemRendered 中使用它时究竟有什么帮助?你确定你从互联网上得到结果吗?你试过滑翔还是毕加索?
    • 我编写的代码与您在 onBeforeClusterItemRendered @Vadim Eksler 中看到的代码相同
    • onBeforeClusterItemRendered 方法将在您的 Internet 请求结束之前结束
    • 好的。谢谢。我会再试一次。你知道如何解决第二个问题吗?@Vadim Eksler
    • 关于 setUpdateMarker() ?我没看到你叫它。
    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2016-06-22
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多