Java NetworkImageView从文件中设置图像

Java NetworkImageView从文件中设置图像,java,android,image,networkimageview,Java,Android,Image,Networkimageview,我有一个NetworkImageView,它从URL加载内容,但在特定情况下,我还希望能够从用户的图库加载图像(甚至用相机拍摄图像) 我正在使用从图库加载图像,选择后,它允许我获取图像的文件路径。此路径类似于/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg 如果我尝试直接从此路径加载图像,Volley将引发一个异常,说明: NetworkDispatcher.run:未处理的异常java.lang.RuntimeException:错误的U

我有一个
NetworkImageView
,它从URL加载内容,但在特定情况下,我还希望能够从用户的图库加载图像(甚至用相机拍摄图像)

我正在使用从图库加载图像,选择后,它允许我获取图像的文件路径。此路径类似于
/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

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

NetworkDispatcher.run:未处理的异常java.lang.RuntimeException:错误的URL
/mnt/sdcard/bimagechooser/IMG\u 20140811\u 155007906.jpg

我还尝试设置可拉伸:

Drawable newImage = Drawable.createFromPath(imagePath);
mNetworkImageView.setImageDrawable(newImage);
运行这些行时不会发生任何情况,视图保持为空/不变


设置无URL的
网络图像视图
内容的正确方法是什么?

我不确定,但值得尝试:

当您为您的mImageLoader创建内存缓存时,请将其保留在某个位置,现在为您的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并将其返回给您


我希望有帮助

我不确定,但值得一试:

当您为您的mImageLoader创建内存缓存时,请将其保留在某个位置,现在为您的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并将其返回给您


我希望有帮助

setImageDrawable
不起作用的原因是因为在
onLayout
setImageUrl
中调用私有方法
LoadImageIfEssential
,如果没有提供图像url,该方法将调用另一个私有方法
setDefaultImageOrNull
。这将清除通过
setImageDrawable
设置的任何内容

截击的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);
    }
}
您可以按照@mmloolo的建议手动将您的图像添加到图像缓存中,也可以根据截图创建您自己的“NetworkImageView”,并在没有提供url的情况下让
onLayout
不调用
LoadImageIfEssential
。然后,您可以覆盖ImageView setters
setImageDrawable
setImageURI
以将url设置为空。然后,您可以像通常使用ImageView一样使用setImageDrawable和setImageURI

注意:如果覆盖
setImageBitmap
setImageResource
方法,则可能会遇到问题,因为这些方法在
loadimageifneeded
中调用。我还没有遇到问题,但是我没有做太多的测试

你们班

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);
}    

}

setImageDrawable
不起作用的原因是,在
onLayout
setImageUrl
中调用私有方法
LoadImageIfEssential
,如果没有提供图像url,该方法将调用另一个私有方法
setDefaultImageOrNull
。这将清除通过
setImageDrawable
设置的任何内容

截击的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);
    }
}
您可以按照@mmloolo的建议手动将您的图像添加到图像缓存中,也可以根据截图创建您自己的“NetworkImageView”,并在没有提供url的情况下让
onLayout
不调用
LoadImageIfEssential
。然后,您可以覆盖ImageView setters
setImageDrawable
setImageURI
以将url设置为空。然后,您可以像通常使用ImageView一样使用setImageDrawable和setImageURI

注意:如果覆盖
setImageBitmap
setImageResource
方法,则可能会遇到问题,因为这些方法在
loadimageifneeded
中调用。我还没有遇到问题,但是我没有做太多的测试

你们班

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);
}    

}


你还认为这是可能的吗?请显示适当的文档。好吧,至少
setImageDrawable
应该可以工作,因为该类扩展了
ImageView
,我现在看到它来自Volley库(您可能已经提到了),并且确实扩展了ImageView。因此,您可以使用ImageView执行所有可能的操作。位图myBitmap=BitmapFactory.decodeFile(imgFile.getAbsolutePath());ImageView ImageView=(ImageView)findViewById(R.id.ImageView);设置图像位图(myBitmap);这是我的想法,但显然它不起作用。正确,它不起作用,请参阅下面我的答案以获取信息。你仍然认为这是可能的吗?请显示适当的文档。好吧,至少
setImageDrawable
应该可以工作,因为该类扩展了
ImageView
,我现在看到它来自Volley库(您可能已经提到了),并且确实扩展了ImageView。因此,您可以使用ImageView执行所有可能的操作。位图myBitmap=BitmapFactory.decodeFile(imgFile.getAbsolutePath());ImageView ImageView=(ImageView)findViewById(R.id.ImageView);设置图像位图(myBitmap);这是我的想法,但显然它不起作用。正确,它不起作用,请参阅下面的答案以获取信息。
url
param是文件路径?我认为这不会产生任何问题,因为您已经将位图放入他的缓存中,他永远不会提出任何网络请求,首先,他查看他的缓存,如果他找到了图像,他就会得到它,仅此而已。我仍然不知道我应该使用什么URL,如何/何时将图像添加到缓存中。在调用NetworkImage(setImgURL,mImageLoader)之前,任何假URL都会起作用;在getView中,您必须将drables放在他的缓存中,然后用setImgURL替换该行的伪url。您尝试过我的解决方案吗?
url
param是文件路径?我认为这不会产生任何问题,因为您已经将位图放在他的缓存中,他永远不会提出任何网络请求,首先他会查看他的cac