Android 带Url的谷歌地图集群

Android 带Url的谷歌地图集群,android,google-maps,markerclusterer,android-glide,Android,Google Maps,Markerclusterer,Android Glide,我使用谷歌的Android Map utils库使用谷歌地图集群。在我的例子中,我使用Glide从URL加载图像: @Override protected void onBeforeClusterItemRendered(final FeedsModel feedsModel, final MarkerOptions markerOptions) { // Draw a single person. // Set the info

我使用谷歌的Android Map utils库使用谷歌地图集群。在我的例子中,我使用Glide从URL加载图像:

@Override
        protected void onBeforeClusterItemRendered(final FeedsModel feedsModel, final MarkerOptions markerOptions) {
            // Draw a single person.
            // Set the info window to show their name.
            Glide
                    .with(mActivity.getApplicationContext())
                    .load(feedsModel.getImages().getThumbnail().getUrl())
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(new SimpleTarget<GlideDrawable>() {
                        @Override
                        public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                            mImageView.setImageDrawable(resource);
                            Bitmap icon = mIconGenerator.makeIcon();
                            Marker markerToChange = null;
                            for (Marker marker : mClusterManager.getMarkerCollection().getMarkers()) {
                                if (marker.getPosition().equals(feedsModel.getPosition())) {
                                    markerToChange = marker;
                                }
                            }
                            // if found - change icon
                            if (markerToChange != null) {
                                markerToChange.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                            }
                        }
                    });
            Bitmap icon = mIconGenerator.makeIcon();
            markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
        }

        @Override
        protected void onBeforeClusterRendered(final Cluster<FeedsModel> cluster, final MarkerOptions markerOptions) {
            // Draw multiple people.
            // Note: this method runs on the UI thread. Don't spend too much time in here (like in this example).
            final List<Drawable> profilePhotos = new ArrayList<Drawable>(Math.min(4, cluster.getSize()));
            final int width = mDimension;
            final int height = mDimension;

            int i = 0;

            for (final FeedsModel p : cluster.getItems()) {
                // Draw 4 at most.
                i++;
                Glide
                        .with(mActivity.getApplicationContext())
                        .load(p.getImages().getThumbnail().getUrl())
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .into(new SimpleTarget<GlideDrawable>() {
                            @Override
                            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                                resource.setBounds(0, 0, width, height);
                                profilePhotos.add(resource);
                                MultiDrawable multiDrawable = new MultiDrawable(profilePhotos);
                                multiDrawable.setBounds(0, 0, width, height);

                                mClusterImageView.setImageDrawable(multiDrawable);
                                Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
                                markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
                            }
                        });

                if (i == 4) break;
            }
            Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
            markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
        }
@覆盖
在呈现前ClusterItem(最终FeedsModel FeedsModel、最终MarkeOptions MarkeOptions)之前受保护的空{
//画一个人。
//设置“信息”窗口以显示其名称。
滑翔
.with(mActivity.getApplicationContext())
.load(feedsModel.getImages().getThumbnail().getUrl())
.diskCacheStrategy(diskCacheStrategy.ALL)
.into(新的SimpleTarget(){
@凌驾

public void onResourceReady(GlideDrawable资源,GlideAnimation最后,我找到了解决方案,我结合了:

protected void onClusterItemRendered(FeedsModel clusterItem, Marker marker) 
protected void onClusterRendered(Cluster<FeedsModel> cluster, Marker marker)
在ClusterItemRendered(FeedsModel clusterItem、Marker-Marker)上受保护的void
受保护的void onClusterRendered(群集、标记)
这些函数用于从URL加载图像
@Override
protected void onBeforeClusterItemRendered(Trace trace, MarkerOptions markerOptions) {
    // Draw a single person.
    // Set the info window to show their name.

    mImageView.setImageResource(R.drawable.aa001); //temp image.
    icon = mIconGenerator.makeIcon();
    markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));

}
@Override
protected void onClusterItemRendered(final Trace trace, final Marker marker){

    Glide.with(mContext.getApplicationContext())
            .load(ApplicationClass.photoServer + trace.image)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .thumbnail(0.1f)
            .into(new SimpleTarget<GlideDrawable>() {
                @Override
                public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                    mImageView.setImageDrawable(resource);
                    icon = mIconGenerator.makeIcon();
                    marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                }
            });
}
在呈现BeforeClusterItem(跟踪跟踪、标记选项标记选项)之前受保护的void{ //画一个人。 //设置“信息”窗口以显示其名称。 mImageView.setImageResource(R.drawable.aa001);//临时图像。 icon=micongGenerator.makeIcon(); 图标(BitmapDescriptorFactory.fromBitmap(图标)); } @凌驾 受保护的void onClusterItemRendered(最终跟踪、最终标记){ Glide.with(mContext.getApplicationContext()) .load(ApplicationClass.photoServer+trace.image) .diskCacheStrategy(diskCacheStrategy.ALL) .缩略图(0.1f) .into(新的SimpleTarget(){ @凌驾
public void onResourceReady(GlideDrawable resource,GlideAnimation在
onBeforeClusterRendered
中隐藏标记。这样做可以使标记图标不会在默认图标和自定义图标之间闪烁

onClusterItemRendered
中,获取图标位图,一旦加载,将其设置为标记图标并使标记可见。如果位图请求失败,只需显示默认图标

使用毕加索进行缓存

    final String url = "...";
    clusterManager.setRenderer(new DefaultClusterRenderer<MapClusterItem>(activity, googleMap, clusterManager) {

        @Override
        protected void onBeforeClusterItemRendered(MapClusterItem item, MarkerOptions markerOptions) {
            markerOptions.visible(false);
        }

        @Override
        protected void onClusterItemRendered(final MapClusterItem clusterItem, final Marker marker) {

            Picasso.
                    with(context).
                    load(url)
                    .into(new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
                    marker.setVisible(true);
                }

                @Override
                public void onBitmapFailed(Drawable errorDrawable) {
                    marker.setVisible(true);
                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {}
            });
        }
    });
最终字符串url=“…”;
setRenderer(新的DefaultClusterRenderer(活动、Google地图、clusterManager){
@凌驾
PreforeClusterItemRendered(MapClusterItem项、MarkeOptions MarkeOptions)上受保护的void{
标记选项。可见(假);
}
@凌驾
ClusterItemRendered上受保护的空(最终贴图clusterItem、最终标记){
毕加索。
有(上下文)。
加载(url)
.into(新目标){
@凌驾
已加载位图(位图位图,Picasso.LoadedFrom){
setIcon(BitmapDescriptorFactory.fromBitmap(位图));
marker.setVisible(true);
}
@凌驾
公共无效onBitmapFailed(Drawable errorDrawable){
marker.setVisible(true);
}
@凌驾
public void onPrepareLoad(可提取占位符可提取){}
});
}
});

这是我在上述解决方案的帮助下找到的解决方案

private class PersonRenderer extends DefaultClusterRenderer<Person> {
    private final IconGenerator mIconGenerator = new IconGenerator(getActivity().getApplicationContext());
    private final IconGenerator mClusterIconGenerator = new IconGenerator(getActivity().getApplicationContext());
    private final ImageView mImageView;
    private final ImageView mClusterImageView;
    private final int mDimension;
    Bitmap icon;

    public PersonRenderer() {
        super(getActivity().getApplicationContext(), mMap, mClusterManager);

        View multiProfile = getLayoutInflater().inflate(R.layout.multi_profile, null);
        mClusterIconGenerator.setContentView(multiProfile);
        mClusterImageView = (ImageView) multiProfile.findViewById(R.id.image);

        mImageView = new ImageView(getActivity().getApplicationContext());
        mDimension = (int) getResources().getDimension(R.dimen.custom_profile_image);
        mImageView.setLayoutParams(new ViewGroup.LayoutParams(mDimension, mDimension));
        int padding = (int) getResources().getDimension(R.dimen.custom_profile_padding);
        mImageView.setPadding(padding, padding, padding, padding);
        mIconGenerator.setContentView(mImageView);
    }

    @Override
    protected void onBeforeClusterItemRendered(Person person, MarkerOptions markerOptions) {
        icon = mIconGenerator.makeIcon();
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)).title(person.name);
    }

    @Override
    protected void onClusterItemRendered(Person clusterItem, final Marker marker) {
        Glide.with(getActivity())
                .load(clusterItem.profilePhoto)
                .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
                .thumbnail(0.1f)
                .into(new SimpleTarget<Drawable>() {
                    @Override
                    public void onResourceReady(Drawable drawable, Transition<? super Drawable> transition) {
                        mImageView.setImageDrawable(drawable);
                        icon = mIconGenerator.makeIcon();
                        marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                    }
                });
    }

    @Override
    protected void onClusterRendered(final Cluster<Person> cluster, final Marker marker) {
        final List<Drawable> profilePhotos = new ArrayList<>(Math.min(4, cluster.getSize()));
        final int width = mDimension;
        final int height = mDimension;
        Bitmap dummyBitmap = null;
        Drawable drawable;
        final int clusterSize = cluster.getSize();
        final int[] count = {0};

        for (Person p : cluster.getItems()) {
            // Draw 4 at most.
            if (profilePhotos.size() == 4) break;
            try {
                Glide.with(getActivity().getApplicationContext())
                        .load(p.profilePhoto)
                        .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
                        .into(new SimpleTarget<Drawable>(){
                            @Override
                            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                                resource.setBounds(0, 0, width, height);
                                profilePhotos.add(resource);
                                MultiDrawable multiDrawable = new MultiDrawable(profilePhotos);
                                multiDrawable.setBounds(0, 0, width, height);

                                mClusterImageView.setImageDrawable(multiDrawable);
                                Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
                                marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                            }
                        });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
        marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected void onBeforeClusterRendered(final Cluster<Person> cluster, final MarkerOptions markerOptions) {
    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster cluster) {
        // Always render clusters.
        return cluster.getSize() > 1;
    }

}
私有类PersonRenderer扩展了DefaultClusterRenderer{
私有最终IconGenerator mIconGenerator=新IconGenerator(getActivity().getApplicationContext());
私有最终IconGenerator mClusterIconGenerator=新IconGenerator(getActivity().getApplicationContext());
私有最终图像视图mImageView;
私有最终图像视图mClusterImageView;
私人最终尺寸;
位图图标;
公众人物{
super(getActivity().getApplicationContext(),mMap,mClusterManager);
View multiProfile=GetLayoutFlater()。充气(R.layout.multi_profile,null);
setContentView(多功能文件);
mClusterImageView=(ImageView)multiProfile.findViewById(R.id.image);
mImageView=newimageview(getActivity().getApplicationContext());
mDimension=(int)getResources().getdimen(R.dimen.custom\u profile\u image);
mImageView.setLayoutParams(新视图组.LayoutParams(MDiDimension,MDiDimension));
int padding=(int)getResources().getDimension(R.dimen.custom_profile_padding);
setPadding(padding,padding,padding,padding);
setContentView(mImageView);
}
@凌驾
PreforeClusterItemRendered上的受保护无效(Person Person,MarkeOptions MarkeOptions){
icon=micongGenerator.makeIcon();
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)).title(person.name);
}
@凌驾
ClusterItemRendered上受保护的空(个人群集项、最终标记){
Glide.with(getActivity())
.load(clusterItem.profilePhoto)
.apply(新请求选项().diskCacheStrategy(diskCacheStrategy.ALL))
.缩略图(0.1f)
.into(新的SimpleTarget(){
@凌驾

public void onResourceReady(Drawable Drawable,Transition)您能分享此问题的详细信息方法吗?您能提供一个代码段吗?因为它对我有用,但当我放大或缩小地图图像时,会发生变化。
private class PersonRenderer extends DefaultClusterRenderer<Person> {
    private final IconGenerator mIconGenerator = new IconGenerator(getActivity().getApplicationContext());
    private final IconGenerator mClusterIconGenerator = new IconGenerator(getActivity().getApplicationContext());
    private final ImageView mImageView;
    private final ImageView mClusterImageView;
    private final int mDimension;
    Bitmap icon;

    public PersonRenderer() {
        super(getActivity().getApplicationContext(), mMap, mClusterManager);

        View multiProfile = getLayoutInflater().inflate(R.layout.multi_profile, null);
        mClusterIconGenerator.setContentView(multiProfile);
        mClusterImageView = (ImageView) multiProfile.findViewById(R.id.image);

        mImageView = new ImageView(getActivity().getApplicationContext());
        mDimension = (int) getResources().getDimension(R.dimen.custom_profile_image);
        mImageView.setLayoutParams(new ViewGroup.LayoutParams(mDimension, mDimension));
        int padding = (int) getResources().getDimension(R.dimen.custom_profile_padding);
        mImageView.setPadding(padding, padding, padding, padding);
        mIconGenerator.setContentView(mImageView);
    }

    @Override
    protected void onBeforeClusterItemRendered(Person person, MarkerOptions markerOptions) {
        icon = mIconGenerator.makeIcon();
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)).title(person.name);
    }

    @Override
    protected void onClusterItemRendered(Person clusterItem, final Marker marker) {
        Glide.with(getActivity())
                .load(clusterItem.profilePhoto)
                .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
                .thumbnail(0.1f)
                .into(new SimpleTarget<Drawable>() {
                    @Override
                    public void onResourceReady(Drawable drawable, Transition<? super Drawable> transition) {
                        mImageView.setImageDrawable(drawable);
                        icon = mIconGenerator.makeIcon();
                        marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                    }
                });
    }

    @Override
    protected void onClusterRendered(final Cluster<Person> cluster, final Marker marker) {
        final List<Drawable> profilePhotos = new ArrayList<>(Math.min(4, cluster.getSize()));
        final int width = mDimension;
        final int height = mDimension;
        Bitmap dummyBitmap = null;
        Drawable drawable;
        final int clusterSize = cluster.getSize();
        final int[] count = {0};

        for (Person p : cluster.getItems()) {
            // Draw 4 at most.
            if (profilePhotos.size() == 4) break;
            try {
                Glide.with(getActivity().getApplicationContext())
                        .load(p.profilePhoto)
                        .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
                        .into(new SimpleTarget<Drawable>(){
                            @Override
                            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                                resource.setBounds(0, 0, width, height);
                                profilePhotos.add(resource);
                                MultiDrawable multiDrawable = new MultiDrawable(profilePhotos);
                                multiDrawable.setBounds(0, 0, width, height);

                                mClusterImageView.setImageDrawable(multiDrawable);
                                Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
                                marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
                            }
                        });
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        Bitmap icon = mClusterIconGenerator.makeIcon(String.valueOf(cluster.getSize()));
        marker.setIcon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected void onBeforeClusterRendered(final Cluster<Person> cluster, final MarkerOptions markerOptions) {
    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster cluster) {
        // Always render clusters.
        return cluster.getSize() > 1;
    }

}