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