Android地图实用程序:来自URL的图像
我使用优秀的在地图上显示带有群集的自定义标记。它工作得很好,而且很容易定制 我的问题是如何将本地资源从demo(R.drawable.image\u demo)更改为URL中的图像。我使用Universal Image Loader在imageView异步上加载此图像,但问题是图像没有加载到对应的标记上 有人知道任何例子吗 这是在DefaultClusterRender类中下载和加载图像的代码。提前谢谢Android地图实用程序:来自URL的图像,android,google-maps,google-maps-android-api-2,Android,Google Maps,Google Maps Android Api 2,我使用优秀的在地图上显示带有群集的自定义标记。它工作得很好,而且很容易定制 我的问题是如何将本地资源从demo(R.drawable.image\u demo)更改为URL中的图像。我使用Universal Image Loader在imageView异步上加载此图像,但问题是图像没有加载到对应的标记上 有人知道任何例子吗 这是在DefaultClusterRender类中下载和加载图像的代码。提前谢谢 @Override protected void onBeforeC
@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时遇到了类似的问题,并不是所有的图像都被加载了。每次我运行map活动并放大集群时,都会出现没有图像的不同标记/集群。仅显示标准标记/簇图标 经过两天的反复尝试,它终于成功了。我暂时转到毕加索图书馆去看看是否可行,但我在那里遇到了类似的问题,无法完成。除了毕加索,所有从网络(URL)加载的图像都旋转了90度。我不明白为什么。根据我在网上发现的一些帖子,它可能与该设备有关,我正在使用三星Galaxy S5设备进行测试。但不确定 下面是我的一些注意事项:我创建了一个带有ImageView的
HardRefSimpleMapgeLoadingListener
,该ImageView将一直存在,直到UIL加载过程完成。如果没有它的硬引用ImageView
将调用onLoadingCancelled,加载将无法完成。我还创建了对象ClusterMarkerTarget
和ClusterItemMarkerTarget
,其中包含图标生成器的标记、图像视图和位图。我还将它们放入hashsetmyClusterItemMarkerTargets
和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++;
}
}
你必须下载图像,将其存储在某个地方,然后显示出来。你用UIL吗?是的,我用UIL。UIL存储并进行图像缓存,所以我不会为此担心。问题在于加载图像的图像视图不是正确的图像视图。但是图像下载和加载都很好!setImageBitmap(LoadeImage);我也有同样的问题,你是怎么解决的?暂时感谢您,首先我预下载了图像位图,然后将下载的所有数据填充到McCluster中,效果与演示非常相似。有了这个工作流,我就不用UIL了。这是一个可接受的静态标记,但不多。+佩兰-在同一问题上工作。。。希望利用UIL,因为我们的图像存储在后端数据库服务器上,我不想将一堆缩略图下载到设备上(这些缩略图与1000+中的缩略图相同,用于艺术博物馆画廊,不用担心它们不会同时显示在地图上!)。如果你能找到一个解决方案,我会很感兴趣的,我也会从我这边着手,非常感谢!我会为下一个项目保留你的代码:)谢谢,它很有魅力。顺便说一句,有没有办法让它与毕加索一起工作?@franco phong我很高兴它能与你的应用程序一起工作。我相信有办法让毕加索成功,但经过一周(!)的努力,我放弃了,转而使用UIL。非常感谢你,兄弟。它对我有用。你发现毕加索也是这样吗?如果是,请将该代码也发布。。。我真的需要它。。。
//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;
}
}