gpt4 book ai didi

java - NetworkImageView 从文件设置图像

转载 作者:行者123 更新时间:2023-12-01 17:06:42 31 4
gpt4 key购买 nike

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

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

如果我尝试直接从该路径加载图像,Volley 将引发异常:

NetworkDispatcher.run: Unhandled exception java.lang.RuntimeException: Bad URL /mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

我还尝试设置可绘制对象:

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

当这些行运行时,什么也没有发生, View 保持为空/不变。

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

最佳答案

setImageDrawable不起作用的原因是在onLayoutsetImageUrl中调用了私有(private)方法loadImageIfNecessary,如果没有提供图像 url,它将调用另一个私有(private)方法 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 的建议手动将图像添加到图像缓存中,或者基于 Volley 创建自己的“NetworkImageView”,并且让 onLayout 不调用 loadImageIfNecessary 当没有提供 url 时。然后,您可以重写 ImageView setter setImageDrawablesetImageURI 将 url 设置为 null。然后,您可以像平常使用 ImageView 一样使用 setImageDrawable 和 setImageURI。

注意:如果您重写 setImageBitmapsetImageResource 方法,则可能会遇到问题,因为这些方法是在 loadImageIfNecessary 中调用的。我还没有遇到问题,但是我还没有进行太多测试。

你的类(class)...

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

}

关于java - NetworkImageView 从文件设置图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25251193/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com