0

NetworkImageViewURL からコンテンツを読み込む がありますが、特定のケースでは、ユーザーのギャラリーから画像を読み込めるようにしたい (またはカメラで画像をキャプチャすることもできます) 。

Image Chooser Libraryを使用してギャラリーから画像を読み込みます。選択後、画像のファイル パスを取得できます。このパスは次のようなものです/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

このパスから画像を直接読み込もうとすると、Volley は次のような例外を発生させます。

NetworkDispatcher.run: 未処理の例外 java.lang.RuntimeException: 不正な URL/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

私もドローアブルを設定しようとしました:

Drawable newImage = Drawable.createFromPath(imagePath);
mNetworkImageView.setImageDrawable(newImage);

これらの行が実行されても何も起こらず、ビューは空のまま/変更されません。

NetworkImageViewURL なしでコンテンツを設定する正しい方法は何ですか?

4

2 に答える 2

5

setImageDrawable機能しない理由は、提供された画像の URL がない場合に別のプライベート メソッドを呼び出すonLayoutプライベートsetImageUrlメソッドを呼び出すためです。これにより、 で設定したものはすべて消去されます。loadImageIfNecessarysetDefaultImageOrNullsetImageDrawable

Volley の NetworkImageView コード...

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    loadImageIfNecessary(true);
}

void loadImageIfNecessary(final boolean isInLayoutPass) {
    ...

    // if the URL to be loaded in this view is empty, cancel any old requests and clear the
    // currently loaded image.
    if (TextUtils.isEmpty(mUrl)) {
        if (mImageContainer != null) {
            mImageContainer.cancelRequest();
            mImageContainer = null;
        }
        setDefaultImageOrNull();
        return;
    }
    ...
}

private void setDefaultImageOrNull() {
    if(mDefaultImageId != 0) {
        setImageResource(mDefaultImageId);
    }
    else {
        setImageBitmap(null);
    }
}

@mmlooloo が示唆するように、画像を画像キャッシュに手動で追加するか、Volley に基づいて独自の「NetworkImageView」を作成し、URL が提供されていonLayoutない場合は呼び出さないことができます。loadImageIfNecessaryその後、ImageView セッター setImageDrawableをオーバーライドしsetImageURIて、url を null に設定できます。その後、通常 ImageView で行うように、setImageDrawable と setImageURI を使用できます。

注:setImageBitmapまたはsetImageResourceメソッドをオーバーライドすると、これらは 内で呼び出されるため、問題が発生する可能性がありますloadImageIfNecessary。私はまだ問題に遭遇していませんが、多くのテストを行っていません。

あなたのクラス...

public class MyNetworkImageView extends ImageView {

//Copy the code from Volley's NetworkImageView and change onLayout as below.

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    if (!TextUtils.isEmpty(mUrl)) {
        loadImageIfNecessary(true);
    }else{
        if (mImageContainer != null) {
            mImageContainer.cancelRequest();
            mImageContainer = null;
        }
    }
}

//Change the other ImageView image setters, for example...
@Override
public void setImageDrawable(Drawable drawable) {
    mUrl = null;
    super.setImageDrawable(drawable);
}

@Override
public void setImageURI(Uri uri) {
    mUrl = null;
    super.setImageURI(uri);
}    

}
于 2014-09-01T19:35:24.767 に答える
0

よくわかりませんが、試してみる価値があります:

mImageLoader のメモリ キャッシュを作成するときは、どこかに保管しておいてください。

このコードによる画像:

    private static String getCacheKey(String url, int maxWidth, int maxHeight) {
    return new StringBuilder(url.length() + 12).append("#W").append(maxWidth)
            .append("#H").append(maxHeight).append(url).toString();
}

その後、次を呼び出して画像をキャッシュに入れます。

 mCache.putBitmap(cacheKey, response);

次に、もう一度 URL を NetworkImageView に送信すると、Volley がキャッシュ内の URL を見つけて返します。

役に立てば幸いです!!

于 2014-08-11T20:23:05.947 に答える