Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 让凌空抽射';s NetworkImageView显示本地图像文件_Android_Android Volley_Networkimageview - Fatal编程技术网

Android 让凌空抽射';s NetworkImageView显示本地图像文件

Android 让凌空抽射';s NetworkImageView显示本地图像文件,android,android-volley,networkimageview,Android,Android Volley,Networkimageview,我正在使用NetworkImageView显示从远程URL下载的一些封面,我成功地缓存并显示了它们,但如果用户愿意,我想让他们设置自己的封面图像。 我尝试将setImageUrl方法与Uri.fromFile(mCoverFile).toString()一起用作参数,但不起作用。由于它是远程图像和本地图像的混合,我无法切换到常规的ImageViews,因此我想知道是否有任何方法可以加载本地图像 我当然知道ImageView的setImageBitmap方法,但是NetworkImageView会

我正在使用
NetworkImageView
显示从远程URL下载的一些封面,我成功地缓存并显示了它们,但如果用户愿意,我想让他们设置自己的封面图像。 我尝试将
setImageUrl
方法与
Uri.fromFile(mCoverFile).toString()
一起用作参数,但不起作用。由于它是远程图像和本地图像的混合,我无法切换到常规的
ImageView
s,因此我想知道是否有任何方法可以加载本地图像

我当然知道
ImageView
setImageBitmap
方法,但是
NetworkImageView
会自动调整创建的
Bitmap
的大小,并防止
View
GridView
ListView
中循环


更新:的回答成功了。要根据您的
视图
大小自动调整位图大小,只需从Volley的源代码复制
ImageRequest.doParse
方法。

网络图像视图扩展了ImageView。您应该能够使用与常规ImageView相同的方法

image.setImageResource(R.drawable.my_image);


NetworkImageView
使用
ImageLoader
,后者又使用
ImageCache

您可以为图像提供自定义的
ImageCache
,前提是对密钥使用相同的机制:

 return new StringBuilder(url.length() + 12).append("#W").append(maxWidth)
            .append("#H").append(maxHeight).append(url).toString();
url
在实际请求完成之前没有进行测试,因此这里没有问题

通常,您的“缓存”可能看起来像:

public class MyCache implements ImageLoader.ImageCache {

    @Override
    public Bitmap getBitmap(String key) {
        if (key.contains("file://")) {
            return BitmapFactory.decodeFile(key.substring(key.indexOf("file://") + 7));
        } else {
            // Here you can add an actual cache
            return null;
        }
    }
    @Override
    public void putBitmap(String key, Bitmap bitmap) {
        // Here you can add an actual cache
    }
}
您使用它的方式如下:

imageView.setImageUrl(Uri.fromFile(mCoverFile).toString(), new MyCache());

(这尚未实际测试,可能需要进行一些调整)

谢谢您的回答。我根据你的帮助写了一些代码

用法:只需使用LocalImageCache.class作为缓存。没有更多的代码要更改

private ImageLoader mLocalImageLoader;

mLocalImageLoader = new ImageLoader(mRequestQueue,
            new LocalImageCache(mCtx));

NetworkImageView test = (NetworkImageView) findViewById(R.id.iv_test);  

test.setImageUrl("/storage/emulated/0/DCIM/Philm/2017_03_24_01_.png", MySingleton.getInstance(this.getApplicationContext()).getLocalImageLoader());

公共类LocalImageCache扩展LruCache实现ImageLoader.ImageCache{
公共LocalImageCache(int maxSize){
超级(最大尺寸);
}
公共LocalImageCache(上下文ctx){
这个(getCacheSize(ctx));
}
@凌驾
公共位图getBitmap(字符串键){
key=key.substring(key.indexOf(“/”);
位图结果=获取(键);
Log.d(“标签”,键);
如果(结果==null){
位图温度=位图工厂.decodeFile(键);
输入(键、温度);
返回温度;
}否则{
返回结果;
}
}
@凌驾
公共位图(字符串键、位图){
//在这里,您可以添加一个实际的缓存
//别碰这里
}
// 默认屏幕5.倍的图片缓存
//返回一个缓存大小,大约等于三个屏幕上的图像。
公共静态int getCacheSize(上下文ctx){
final DisplayMetrics DisplayMetrics=ctx.getResources()。
getDisplayMetrics();
最终整数屏幕宽度=displayMetrics.widthPixels;
最终整数屏幕高度=displayMetrics.heightPixels;
//每像素4字节
最终整数屏幕字节数=屏幕宽度*屏幕高度*4;
返回屏幕字节*5;
}
@凌驾
受保护的int-sizeOf(字符串键、位图值){
返回值.getRowBytes()*value.getHeight();
}

}

阅读完整的问题:本地文件,而不是绘图。我想利用所有
NetworkImageView
功能、位图自动调整大小、防止在网格/列表中回收图像等。可绘制文件是本地文件,我不明白?可绘制文件是/res文件夹中的资源图像。例如,本地文件是保存的jpeg图像或通过USB传输的图像。请参阅我的更新答案,您只需对任何旧的ImageView使用普通路由,因为NetworkImageView实际上是ImageView您不使用常规路由,因为当您使用NetworkImageView时,它也会自动调整位图的大小,以便占用更少的内存,并且使用常规imageview方法不会阻止GridView和ListView中的视图循环。我已经尝试过的这种方法的问题是,我遇到了一个错误:
FileURLConnection无法强制转换为HttpURLConnection
。(也就是说,一旦请求完成,NetworkImageView只需调用
setImageBitmap(response.getBitmap());
。一旦完成,我所看到的视图循环实际上就没有任何阻碍了)我的方法无法打开连接。如果仔细观察,会发现缓存始终命中,因此连接从未打开。这是因为缓存键的结构。它从图像的大小开始。请注意,这将在UI线程上解码位图,这是不可取的。
private ImageLoader mLocalImageLoader;

mLocalImageLoader = new ImageLoader(mRequestQueue,
            new LocalImageCache(mCtx));

NetworkImageView test = (NetworkImageView) findViewById(R.id.iv_test);  

test.setImageUrl("/storage/emulated/0/DCIM/Philm/2017_03_24_01_.png", MySingleton.getInstance(this.getApplicationContext()).getLocalImageLoader());
public class LocalImageCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {

public LocalImageCache(int maxSize) {
    super(maxSize);
}

public LocalImageCache(Context ctx) {
    this(getCacheSize(ctx));
}

@Override
public Bitmap getBitmap(String key) {
    key = key.substring(key.indexOf("/"));
    Bitmap result = get(key);
    Log.d("TAG", key);
    if (result == null) {
        Bitmap temp =  BitmapFactory.decodeFile(key);
        put(key, temp);
        return temp;
    } else {
        return result;
    }
}

@Override
public void putBitmap(String key, Bitmap bitmap) {
    // Here you can add an actual cache
    // Never touch here
}

// 默认屏幕5倍的图片缓存
// Returns a cache size equal to approximately three screens worth of images.
public static int getCacheSize(Context ctx) {
    final DisplayMetrics displayMetrics = ctx.getResources().
            getDisplayMetrics();
    final int screenWidth = displayMetrics.widthPixels;
    final int screenHeight = displayMetrics.heightPixels;
    // 4 bytes per pixel
    final int screenBytes = screenWidth * screenHeight * 4;

    return screenBytes * 5;
}

@Override
protected int sizeOf(String key, Bitmap value) {
    return value.getRowBytes() * value.getHeight();
}