我正在使用Android-Universal-Image-Loader库来加载/缓存远程图像,并且一直在挖掘源代码,试图找到一种方法来检索原始图像大小(宽度和高度)我的ImageLoadingListener。
下面的示例代码只是让您了解我正在尝试做什么。
protected class ViaImageLoadingListener implements ImageLoadingListener {
final SelectableImageView selectableImageView ;
protected ViaImageLoadingListener(SelectableImageView selectableImageView) {
this.selectableImageView = selectableImageView;
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
selectableImageView.setImageBitmap(loadedImage);
// loadedImage.getWeight() will not return the original
// dimensions of the image if it has been scaled down
selectableImageView.setOriginalImageSize(width, height);
selectableImageView.invalidate();
}
我尝试扩展ImageDecoder类和ImageLoader类,以找到将解码器(我可以从#prepareDecodingOptions
方法中获取原始图像大小)链接到我的自定义ImageLoadingListener的循环方法。但是配置对象是私有的,并且字段(包括解码器)无法从子类中访问(并且感觉就像是一种解决问题的过于hacky方式)。
我是否忽略了一种简单的“内置”方式来获取原始图像大小而不会失去UIL扩展/内存管理的好处?
答案 0 :(得分:3)
无法通过参数将原始图像大小从ImageDecoder传递给侦听器。
我认为您的解决方案正在遵循。
扩展BaseImageDecoder
并在其中创建地图以保持图像大小:
Map<String, ImageSize> urlToSizeMap = new ConcurrentHashMap<String, ImageSize>();
然后覆盖defineImageSizeAndRotation(...)
:
protected ImageFileInfo defineImageSizeAndRotation(InputStream imageStream, String imageUri) throws IOException {
ImageFileInfo info = super.defineImageSizeAndRotation(imageStream, imageUri);
urlToSizeMap.put(imageUri, info.imageSize); // Remember original image size for image URI
return info;
}
注意:info.imageSize
无法编译,因为imageSize
不可见。我将在下一个版本(1.8.5)中修复它,但您现在可以使用反射。
将此解码器设置为配置并在任何地方保持对此解码器的引用(或者您可以使urlToSizeMap
静态以从侦听器访问)。
然后在你的听众中:
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
selectableImageView.setImageBitmap(loadedImage);
ImageSize imageSize = decoder.urlToSizeMap.get(imageUri);
selectableImageView.setOriginalImageSize(imageSize.getWidth(), imageSize.getHeight());
selectableImageView.invalidate();
}
答案 1 :(得分:0)
如果您想获得加载图像的原始大小,似乎您不必实现自己的ImageLoadingListener。我使用loadImage方法,似乎收到的位图有原始大小。 UIL v1.8.6
loader.loadImage(pin_url, option, new SimpleImageLoadingListener() {
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
showErrorLayout();
}
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
// width - device width
// height - OpenGl maxTextureSize
if (width < loadedImage.getWidth() || height < loadedImage.getHeight()) {
// handle scaling
}
iv.setImageBitmap(loadedImage);
}
});