向guolin大神致敬
guolin大神的Glide专栏全网最全,皮的就不谈了
基本用法:
Glide.with(context) //也可以用fragment 和activity(涉及到生命周期,建议和F和A绑定)
.load("http://aa.com/bb/vv.jpg")
.into(ivImg);
API介绍
-
.load()
除了加载url,还可以加载应用资源,本地图片,二进制流,GIF(但是好像有点不好,还没研究)
.placeholder(R.drawable.loading)
加载时的图片.error(R.drawable.error)
加载失败时的图片.diskCacheStrategy(DiskCacheStrategy.NONE)
指定磁盘缓存类型 种类见学习归纳二.asBitmap()
只允许加载静态图片,如果是GIF那只显示第一帧.asGif()
只允许加载GIF,如果是静态图片显示错误.override(100, 100)
指定图片大小(全段照抄,觉得写的太好了 )
实际上,使用Glide在绝大多数情况下我们都是不需要指定图片大小的。
在学习本节内容之前,你可能还需要先了解一个概念,就是我们平时在加载图片的时候很容易会造成内存浪费。什么叫内存浪费呢?比如说一张图片的尺寸是1000 *1000像素,但是我们界面上的ImageView可能只有200 * 200像素,这个时候如果你不对图片进行任何压缩就直接读取到内存中,这就属于内存浪费了,因为程序中根本就用不到这么高像素的图片。
关于图片压缩这方面,我之前也翻译过Android官方的一篇文章,感兴趣的朋友可以去阅读一下 Android高效加载大图、多图解决方案,有效避免程序OOM 。
而使用Glide,我们就完全不用担心图片内存浪费,甚至是内存溢出的问题。因为Glide从来都不会直接将图片的完整尺寸全部加载到内存中,而是用多少加载多少。Glide会自动判断ImageView的大小,然后只将这么大的图片像素加载到内存当中,帮助我们节省内存开支。
当然,Glide也并没有使用什么神奇的魔法,它内部的实现原理其实就是上面那篇文章当中介绍的技术,因此掌握了最基本的实现原理,你也可以自己实现一套这样的图片压缩机制。
也正是因为Glide是如此的智能,所以刚才在开始的时候我就说了,在绝大多数情况下我们都是不需要指定图片大小的,因为Glide会自动根据ImageView的大小来决定图片的大小。
不过,如果你真的有这样的需求,必须给图片指定一个固定的大小,Glide仍然是支持这个功能的。使用.override即可。这里使用override()方法指定了一个图片的尺寸,也就是说,Glide现在只会将图片加载成100*100像素的尺寸,而不会管你的ImageView的大小是多少了。
.skipMemoryCache(true)
关闭内存缓存,Glide是默认打开内存缓存.preload()
当我们因为某些原因或者效果需要提前下载好图片,等到需要显示的时候,不想等待漫长的网络加载时间,就可以使用.preload()。
用法:(不和.into()一起使用)
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload()
等到需要使用时:
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into()
此处需要说明的是:这里的.diskCacheStrategy最好使用到DiskCacheStrategy.SOURCE这个类型。因为preload()默认下载的是原尺寸的图。而.into()则会根据图片的大小来决定加载图片的大小。所以如果不把diskCacheStrategy都设置成DiskCacheStrategy.SOURCE,则会出现即使我预下载好了之后使用into()设置图片时,但是仍然会去去从网络请求图片。
- .downloadOnly(int width, int height)
public void downloadImage(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
final Context context = getApplicationContext();
FutureTarget<File> target = Glide.with(context)
.load(url)
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);
final File imageFile = target.get();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
需要注意:
1.context需要为getApplicationContxt();不然可能会有内存泄漏
2.返回值是一个FutureTarget对象。调用get()即可获得图片文件路径。但是如果图片未下载完,则这个方法会被阻塞。所以使用downloadOnly()时,需要开个子线程运行。