我正在使用NetworkImageView
显示从远程网址下载的一些封面,我成功设法缓存并显示它们,但我想让用户根据需要设置自己的封面图片。
我尝试使用setImageUrl
方法和Uri.fromFile(mCoverFile).toString()
作为参数,但它不起作用。由于它是远程和本地图像的混合,我无法切换到常规ImageView
,因此我想知道是否有任何方法可以启用加载本地图像。
我当然知道ImageView
的{{1}}方法,但setImageBitmap
会自动调整已创建的NetworkImageView
的大小,同时也会阻止Bitmap
回收View
{1}}和GridView
s。
更新: njzk2的答案就行了。要根据ListView
大小自动调整位图,只需从Volley的源代码中复制View
方法。
答案 0 :(得分:7)
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());
(这尚未经过实际测试,可能会进行一些调整)
答案 1 :(得分:1)
感谢您的回答。我根据你的帮助写了一些代码。
用法:只使用LocalImageCache.class作为Cache。没有更多的代码可以改变。
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();
}
}
答案 2 :(得分:0)
NetworkImageView扩展了ImageView。您应该能够使用与常规ImageView相同的方法
image.setImageResource(R.drawable.my_image);
或
imageView.setImageBitmap(BitmapFactory.decodeFile(imagePath));