java - NetworkImageView 从文件设置图像

标签 java android image networkimageview

我有一个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/

相关文章:

java - 如何转换 YCbCr(YUV) 4 :4:4 image to 4:2:2 in java?

c# - 尝试以编程方式将图像添加到资源。设置图片源时出现System.ArgumentException

java - 如何在struts2中只返回数组而不是json对象

java - 设计访问可能为空或 null 的字符串字段的比较器的最佳方法

java - 使用maven从git获取代码+执行构建+打包成jar+最后压缩包含jar和资源的完整文件夹

java - 虽然 JBPM spring 集成获取 org.jbpm.task.Attachment"无法解决错误

android - 在 Android 上使用 Google map 为数百个标记制作动画

java - Android 中来自谷歌服务的网络错误

android - 正确的 Android REST 客户端

c# - System.Drawing.Graphics Drawimage 将IOS拍摄的图片旋转90度