【问题标题】:Android Maps Utility: images from URLAndroid 地图实用程序:来自 URL 的图像
【发布时间】:2014-04-11 13:12:25
【问题描述】:

我正在使用出色的Android Maps Utility library 在地图上显示带有集群的自定义标记。它工作得很好,而且很容易定制。

我的问题是如何将本地资源从演示 (R.drawable.image_demo) 更改为来自 URL 的图像。我正在使用 Universal Image Loader 在 imageView 上异步加载这些图像,但问题是图像没有加载到对应的标记上。

有人知道任何例子吗?

这是在 DefaultClusterRender 类中下载和加载图像的代码。提前致谢。

        @Override
    protected void onBeforeClusterItemRendered(MapFoto mapFoto, MarkerOptions markerOptions) {
        // Draw a single person.
        // Set the info window to show their name.
        // mImageView.setImageResource(R.drawable.barcelona);
        // mImageView.setScaleType(ScaleType.CENTER_CROP);

        Log.d("", "--- url: " + mapFoto.getPictureUrl());
        ImageLoader.getInstance().displayImage(mapFoto.getPictureUrl(), mImageView, BlipointApp.optionsAvatarImage, new ImageLoadingListener() {
            @Override
            public void onLoadingStarted(String imageUri, View view) {
            }

            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
            }

            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                mImageView.setImageBitmap(loadedImage);
                mImageView.setScaleType(ScaleType.CENTER_CROP);
            }

            @Override
            public void onLoadingCancelled(String imageUri, View view) {
            }
        });

        Bitmap icon = mIconGenerator.makeIcon();
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)).title(mapFoto.getName());
    }

【问题讨论】:

  • 您必须下载图像并将其存储在某个位置然后显示。你使用 UIL 吗?
  • 是的,我正在使用 UIL。 UIL 存储并缓存图像,所以我不会担心这个。问题是加载图像的图像视图不是正确的图像视图。但是图像下载并加载正常! mImageView.setImageBitmap(loadedImage);
  • 我也有同样的问题,你是怎么解决的?谢谢
  • 目前,我首先预下载图像位图,然后将下载的所有数据填充到 mCluster 中,就像演示一样完美。通过这个工作流程,我没有使用 UIL。这对于静态标记来说是可以接受的,而且不多。
  • +Pelanes - 处理同一个问题...想要利用 UIL,因为我们的图像存储在后端数据库服务器上,我不想将一堆缩略图下载到设备(一堆就像在 1000+ 中一样——它是一个艺术博物馆画廊,不用担心它们不会同时显示在地图上!)。如果您找到解决方案,我会很感兴趣 - 也会从我这边着手解决。

标签: android google-maps google-maps-android-api-2


【解决方案1】:

我在使用 UIL 时遇到了类似的问题,并非所有图像都已加载。每次我运行地图活动并放大集群时,都会有不同的标记/集群没有图像。仅显示标准标记/群集图标。

经过两天的尝试和尝试,它终于可以正常工作了。暂时我已经切换到毕加索图书馆,看看它是否可以工作,但我在那里遇到了类似的问题,无法完成。除了毕加索,所有从网络(URL)加载的图像都被旋转了 90 度。我不知道为什么。根据我在网上发现的一些帖子,它可能与设备有关,我正在使用三星 Galaxy S5 设备进行测试。但不确定....

这里有一些说明我是如何做到的:我创建了一个带有 ImageView 的 HardRefSimpleImageLoadingListener,它在 UIL 加载过程完成之前将一直存在。如果没有它的硬引用ImageView,onLoadingCancelled 将被调用并且加载不会完成。我还创建了对象ClusterMarkerTarget 和ClusterItemMarkerTarget,其中包含图标生成器的标记、ImageView 和位图。我还将它们放入 HashSets myClusterItemMarkerTargets 和 myClusterMarkerTargets 以防止它们被垃圾收集。

也许它对某人有用。

这里有一些代码:

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

        final ClusterItemMarkerTarget pm_ClusterItem = new ClusterItemMarkerTarget(marker);

        myClusterItemMarkerTargets.add(pm_ClusterItem);

        HardRefSimpleImageLoadingListener loadingListener = new HardRefSimpleImageLoadingListener() {
            @Override
            public void onLoadingFailed(String s, View view, FailReason failReason) {
                myClusterItemMarkerTargets.remove(pm_ClusterItem);
            }

            @Override
            public void onLoadingComplete(String s, View view, Bitmap bitmap) {
                mClusterItemImageView.setImageBitmap(bitmap);
                pm_ClusterItem.myIcon_cluster = mClusterItemIconGenerator.makeIcon();
                pm_ClusterItem.mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(pm_ClusterItem.myIcon_cluster));
                myClusterItemMarkerTargets.remove(pm_ClusterItem);
            }

            @Override
            public void onLoadingCancelled(String s, View view) {
                myClusterItemMarkerTargets.remove(pm_ClusterItem);
            }
        };

        ImageLoader.getInstance().displayImage(clusterItem.picPath, pm_ClusterItem.myClusterItemImageView ,   loadingListener );
    }

    @Override
    protected void onClusterRendered(Cluster<ReportItem> cluster, Marker marker) {

        int i=0;
        clustersize = cluster.getSize();

        final ClusterMarkerTarget pm_Cluster = new ClusterMarkerTarget(marker, cluster);

        myClusterMarkerTargets.add(pm_Cluster);

        for (ReportItem r : cluster.getItems()) {
            // Draw 1 at most.
            if (i == 1 ) {
                break;
            }

            HardRefSimpleImageLoadingListener loadingListener = new HardRefSimpleImageLoadingListener() {

                @Override
                public void onLoadingFailed(String s, View view, FailReason failReason) {
                    myClusterMarkerTargets.remove(pm_Cluster);
                }

                @Override
                public void onLoadingComplete(String s, View view, Bitmap bitmap) {
                    mClusterImageView.setImageBitmap(bitmap); // = (ImageView) view; //pm.myClusterImageView;
                    pm_Cluster.myIcon_clusterItem = mClusterIconGenerator.makeIcon(String.valueOf(clustersize));
                    pm_Cluster.myMarker.setIcon(BitmapDescriptorFactory.fromBitmap(pm_Cluster.myIcon_clusterItem));
                    myClusterMarkerTargets.remove(pm_Cluster);
                }

                @Override
                public void onLoadingCancelled(String s, View view) {
                    myClusterMarkerTargets.remove(pm_Cluster);
                }
            };

            ImageLoader.getInstance().displayImage(r.picPath, pm_Cluster.myClusterImageView, loadingListener);

            i++;
        }
    }

更多:

//Set for holding a reference to marker targets --> targets won't get carbage collected during looping and loading images
Set<ReportRenderer.ClusterItemMarkerTarget> myClusterItemMarkerTargets = new HashSet<>();
Set<ReportRenderer.ClusterMarkerTarget>     myClusterMarkerTargets  = new HashSet<>();

更多:

public ReportRenderer(ClusterManager<ReportItem> mClusterManager, GoogleMap map) {

        super(MyApplication.getContext(), map, mClusterManager);

        mDimension  = (int) MyApplication.getContext().getResources().getDimension(R.dimen.custom_report_image);
        mPadding    = (int) MyApplication.getContext().getResources().getDimension(R.dimen.custom_report_padding);

        // initialize cluster icon generator
        View multiReport = inflater.inflate(R.layout.multi_report, null);
        mClusterImageView = (ImageView) multiReport.findViewById(R.id.image_report);
        mClusterIconGenerator = new IconGenerator(MyApplication.getContext());
        mClusterIconGenerator.setContentView(multiReport);

        // initialize cluster item icon generator
        mClusterItemImageView = new ImageView(MyApplication.getContext());
        mClusterItemImageView.setLayoutParams(new ViewGroup.LayoutParams(mDimension, mDimension));
        mClusterItemImageView.setPadding(mPadding, mPadding, mPadding, mPadding);
        mClusterItemIconGenerator = new IconGenerator(MyApplication.getContext());
        mClusterItemIconGenerator.setContentView(mClusterItemImageView);

        // initialize image loader
        options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.loading)
                .showImageForEmptyUri(R.drawable.warning)
                .showImageOnFail(R.drawable.fail)
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .considerExifParams(true)
                        //.bitmapConfig(Bitmap.Config.RGB_565)
                .build();
        config = new ImageLoaderConfiguration.Builder(MyApplication.getContext())
                .defaultDisplayImageOptions(options)
                .build();
        ImageLoader.getInstance().init(config);
    }

更多:

//cluster marker with image loaded by Ultimate Image Loader
    class ClusterMarkerTarget {

        Marker    myMarker;
        ImageView myClusterImageView;

        public ClusterMarkerTarget(Marker marker, Cluster<ReportItem> cluster) {
            myMarker = marker;
            View multiReport = inflater.inflate(R.layout.multi_report, null);
            myClusterImageView = (ImageView) multiReport.findViewById(R.id.image_report);
        }
    }

    //cluster item marker with image loaded by Ultimate Image Loader
    class ClusterItemMarkerTarget {

        Marker      mMarker;
        ImageView   myClusterItemImageView;

        public ClusterItemMarkerTarget(Marker marker) {
            mMarker = marker;
            myClusterItemImageView =  new ImageView(MyApplication.getContext());//mClusterItemImageView;
            myClusterItemImageView.setLayoutParams(new ViewGroup.LayoutParams(mDimension, mDimension));
            int padding = (int) MyApplication.getContext().getResources().getDimension(R.dimen.custom_report_padding);
            myClusterItemImageView.setPadding(padding, padding, padding, padding);
        }
    }

最后:

 class HardRefSimpleImageLoadingListener extends SimpleImageLoadingListener {
        public ImageView mView;

        @Override
        public void onLoadingStarted(String imageUri, View view) {
            mView = (ImageView) view;
        }
    }

【讨论】:

  • 非常感谢!我将使用 GoogleMapsUtil 为下一个项目保留您的代码 :)
  • 谢谢,它就像一个魅力。顺便说一句,有没有办法让它与毕加索一起工作?
  • @franco-phong 我很高兴它适用于您的应用程序。我确信有一种方法可以让它与 Picasso 一起使用,但经过一周(!)的尝试后,我放弃了并切换到 UIL。
  • 非常感谢兄弟。这个对我有用。你发现毕加索也这样做了吗?如果是,请也发布该代码...我真的需要它...
猜你喜欢
  • 2015-06-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多