NetworkImageView从文件中设置图像

时间:2014-08-11 19:48:28

标签: java android image networkimageview

我有一个NetworkImageView从URL加载其内容,但在特定情况下,我还希望能够从用户的图库中加载图像(甚至可以使用相机捕获图像)。

我使用Image Chooser Library从图库中加载图片,选择后,它可以让我获取图片的文件路径。此路径类似于/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

如果我尝试直接从此路径加载图像,Volley将引发一个异常声明:

  

NetworkDispatcher.run:未处理的异常java.lang.RuntimeException:错误的网址/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

我也试过设置drawable:

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

当这些线条运行时没有任何反应,视图保持空白/不变。

在没有网址的情况下设置NetworkImageView内容的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

setImageDrawable不起作用的原因是因为在onLayoutsetImageUrl中调用私有方法loadImageIfNecessary,如果调用另一个私有方法setDefaultImageOrNull没有提供图像网址。这会消除您通过setImageDrawable设置的任何内容。

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建议的那样,手动将图像添加到图像缓存中,或者创建自己的" NetworkImageView"在没有提供网址的情况下,基于Volley&onLayout loadImageIfNecessary不致电setImageDrawable。然后,您可以覆盖ImageView设置器setImageURIsetImageBitmap以将url设置为null。然后,您可以像使用ImageView一样使用setImageDrawable和setImageURI。

注意:如果您覆盖setImageResourceloadImageIfNecessary方法,则可能会遇到问题,因为这些方法是在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); } } 内调用的。我还没有遇到问题,但是我没有做太多测试。

你的班级......

{{1}}

答案 1 :(得分: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);

然后再次将您的网址发送到NetworkImageView,Volley将在其缓存中找到您的网址并将其返回给您。

我希望它有所帮助!!