1.
常见图片库:Glide
,Fresco
,Picasso
、Universal Image Loader
Glide: 支持Gif、WebP
、Google 推荐
、
Picasso: Square开源
、只缓存原始尺寸图片
Fresco: Facebook开源
、使用较复杂
、库包体积偏大(2-3M)
Glide
和Picasso用法类似,Glide更流畅速度更快,功能更强大,但库相比Picasso更大,方法数更多。细节可参考 点我查看
2.
Glide使用
标签:GIF
、默认HttpUrlConnection
、切换Volley
、切换OkHttp
Min SDK Version: API 14
Compile SDK Version: API 27或更高
Support Library Version: Glide使用的支持库版本为27
2.1 基本用法
: 关键三步走:先with(),再load(),最后into()。熟记这三步,你就已经入门Glide了
// with()可接收Context、Activity 或 Fragment参数,也可传入全局Application
// 传入实例会决定Glide加载图片的生命周期,若传入的是Activity或Fragment实例
// 那么当这个Activity或Fragment被销毁时,图片加载也会停止。
// 若传入的是Application,那么只有当应用程序被杀掉的时候,图片加载才会停止
Glide.with(mContext)
.load(url)// Glide支持加载各种图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等
.skipMemoryCache(true)// 禁用内存缓存
// .asBitmap() // Glide可自动判断加载Bitmap或gif。
.asGif()
.placeholder(R.drawable.loading_spinner)
.error(R.drawable.net_error)// 图片加载失败占位图
.diskCacheStrategy(DiskCacheStrategy.NONE) // 禁用缓存
.crossFade()// 调用crossFade方法在加载图片的过程中会有动画效果,体验更好
.into(mTargetView);
// 加载本地图片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);
// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);
// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);
// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
2.2 高级用法
: 非View目标,如何自定义Target(ViewTarget和SimpleTarget)
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
// TODO
}
};
public void loadImage(View view) {
Glide.with(this)
.load(url)
.into(simpleTarget);
}
使用自定义 Target 有一些陷阱,所以请务必阅读目标文档页的详细内容
2.3 回调与监听
:(例如:当下载图片单独处理处理时)
Glide.with(this)
.load(url)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target,
boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
return false;
}
})
.into(imageView);
如何展示下载后处理成圆角,圆形,模糊等图片
Glide.with(this)
.load(url)
.transform(...)
.into(imageView);
这里附上一个图片变换库:https://github.com/wasabeef/glide-transformations
2.4 如何自定义
: Glide相关配置,以及替换网络请求库
public class MyGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 这是自定义图片缓存位置
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
// 最后在AndroidManifest.xml文件里面添加
<meta-data
android:name="com.yourpackagename.MyGlideMoudle"
android:value="GlideModule" />
2.5 如何实现带进度条的效果
2.6 了解Glide的一些原理和细节
-
Glide如何在当前页面退出时,中止当前页面图片下载的?
答案是通过在当前页面创建一个隐藏的Fragment来获知页面是否退出的 -
Glide缓存有几种策略?
内存缓存外加磁盘缓存 -
Glide如何预加载图片
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
3.
使用踩过的坑
- Glide可以加载图片和gif动画,如果想将gif加载为一张静态图片,可以调用
asBitmap()
- 当列表在滑动的时候,调用
pauseRequests()
取消请求,滑动停止时,调用resumeRequests()
恢复请求。当你想清除掉所有的图片加载请求时,可以调用Glide.clear()
- Glide有时加载不出来图片有可能是因为图片缓存机制的问题,可以调用.override(int, int)方法加载并缓存指定大小图片
- 使用Glide加载圆角图片使用方法如下
Glide.with(context)
.load(pe.img_url)
// 如果要实现更复杂的图片变换则要重写BitmapTransformation这个类,或者使用glide-transformations这个glide的增强库
// bitmapTransform方法传入的参数为BitmapTransformation的对象
// 实现自己的图片转换需要继承这个类,并重写它的transform方法
// 加载圆形的图片使用CropCircleTransformation这个类
// 在加载圆角图片的过程中,CropTransformation,使用这个类除了实现圆角图片之外,可以指定显示图片的部位,比如上半部分或者中间部分等
.bitmapTransform(new RoundTrans(context, 5))
.into(mTargetView);
- 如果使用了其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话,那么可能出现有的图片第一次加载的时候只显示占位图,第二次才显示正常的图片
- 解决方案一: 不设置占位;
- 使用Glide的Transformation API自定义圆形Bitmap的转换。这里是一个已有的例子;http://stackoverflow.com/questions/25278821/how-do-rounded-image-with-glide-library
- 使用下面的代码加载图片:
Glide.with(mContext)
.load(url)
.placeholder(R.drawable.loading_spinner)
.into(new SimpleTarget<Bitmap>(width, height) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
// setImageBitmap(bitmap) on CircleImageView
}
};
- 在使用Glide给imageview加载图片的过程用不能使用view的setTag方法,否则会出现问题,如果要使用最好使用setTag(int,object)方法
4.
阅读源码
4.1
with()
得到一个RequestManager对象
4.2
Glide中的图片缓存key的生成是通过一个散列算法来实现的,所以很难手动去删除指定的图片缓存
Glide的图片缓存都有对应的唯一标识符,如果是相同的,就不加载调用缓存
5.
参考
- Glide不重新加载图片的问题
- Android图片加载框架最全解析(一),Glide的基本用法
- Glide的更详细的用法和介绍可以参考
- 参考文章1
- Glide GitHub官网
- Glide官方中文文档
- 爱走捷径的直接看这篇足以
- https://blog.csdn.net/github_33304260/article/details/70213300 (几个图片库比较)
- https://blog.csdn.net/github_33304260/article/details/70237052
- Glide使用总结
- Glide 这样用,更省内存!!!
- 基于 Glide V4.9.0 封装的图片加载库,可以监听加载图片时的进度