2

我正在使用 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 的迂回方法。但是配置对象是私有的,并且字段(包括解码器)无法从子类中访问(并且无论如何感觉都是一种过于笨拙的解决问题的方法)。

我是否忽略了一种简单的“内置”方式来获取原始图像大小而不会失去 UIL 的缩放/内存管理的好处?

4

2 回答 2

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();
}
于 2013-06-04T17:53:03.763 回答
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);


        }
    });
于 2013-08-28T08:09:06.290 回答