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 に答える