作者:王俊
添加依赖
apply plugin: 'kotlin-kapt'
implementation 'com.github.bumptech.glide:glide:4.9.0'
kapt 'com.github.bumptech.glide:compiler:4.9.0'
基本使用
常规用法
Glide.with(fragment)
.load(myUrl)
.into(imageView);
添加Application 注解用法
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
GlideApp.with(fragment)
.load(myUrl)
.placeholder(placeholder)
.fitCenter()
.into(imageView);
由于Glide 4.0以前可以直接使用generated API ,在4.0之后使用generated API的话必须用@GlideModule
注解生成的 API 默认名为 GlideApp
。这样就可以和之前的用法一样了。
Glide的使用至少要具备三个参数
- with(Context context) - 上下文
- load(String url) - 加载的资源,支持URL、File、URI、String类型等
- into(ImageView imageView) - 目标 ImageView
占位图
val url = "https://pic4.zhimg.com/80/2ef910aa39bbdf3930101ad428601423_hd.jpg"
GlideApp.with(context)
.load(url)
.placeholder(R.drawable.ic_placeholder_small)//图片加载出来前的占位图
.error(R.drawable.ic_placeholder_small)//图片加载失败的占位图
.into(imageView)
图片剪裁
GlideApp.with(this)
.load(url)
.centerCrop()
.into(imageView)
Glide有两个方法可以设置图片剪裁的策略:
- fitCenter 对应ImageView 的
ScaleType
属性中的FIT_CENTER
(默认方式) - centerCrop 对应ImageView 的
ScaleType
属性中的CENTER_CROP
缓存
GlideApp.with(this)
.load(url)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE) //关闭缓存
.into(mImageView)
DiskCacheStrategy 枚举意义
-
DiskCacheStrategy.NONE
什么都不缓存 -
DiskCacheStrategy.SOURCE
只缓存全尺寸图 -
DiskCacheStrategy.RESULT
只缓存最终的加载图 -
DiskCacheStrategy.ALL
缓存所有版本图(默认)
请求优先级
统一时间请求多个图片的时候,如果要指定某张图片优先加载,可以设置器优先级
GlideApp.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.priority(Priority.HIGH) //高优先级
.into(mImageView)
Priority 枚举
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIAT
Gif 和 Video
gif 和Video 通道为默认支持开启
# MP4
val filePath = "/storrage/emulated/0/Pictures/video.mp4"
GlideApp.with(context)
.load(Uri.fromFile(File(filePath)))
.into(imageView)
加载静态图片
val url = "https://pic4.zhimg.com/80/2ef910aa39bbdf3930101ad428601423_hd.jpg"
GlideApp.with(this)
.asBitmap()
.load(url)
.into(mImageView)
Target 回调
Glide本身的链式调用对我们隐藏了所有的回调处理,但是我们如果需要获取Bitmap的话,就需要用到target
。 当然Glide为我们提供了多种Target
GlideApp.with(context)
.asBitmap()
.load(url)
.into(object : BitmapImageViewTarget(imageView) {
override fun setResource(resource: Bitmap?) {
val circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.resources, resource)
imageView.setImageDrawable(circularBitmapDrawable)
}
})
Transformations
很多时候需要对请求的图片进行处理,如:动画、圆角,高斯模糊、滤镜
等;这些都需要我们通过 Transformations 操作 bitmap 来实现,我们可以修改图片的一些属性:尺寸,范围,颜色,像素
等。
这里我推荐 一个 知名第三方 Transformations库
# 高斯模糊
GlideApp.with(this).load(url)
.apply(bitmapTransform(BlurTransformation(25, 3)))
.into(imageView)
动画
- 禁止动画
GlideApp.with(context)
.load(url)
.dontAnimate()//关闭动画
.placeholder(R.drawable.ic_placeholder_small)
.error(R.drawable.ic_placeholder_small)
.into(imageView)
- 加载动画
GlideApp.with(context)
.load(url)
.crossFade(200)//200毫秒淡入淡出动画 默认开启
.placeholder(R.drawable.ic_placeholder_small)
.error(R.drawable.ic_placeholder_small)
.into(imageView)
ImageView 简单封装
我们利用kotlin扩展函数直接扩展ImageView使用Glide加载图片这样的方式使用起来更加方便也便于维护,目前只扩展几个常用的使用场景,如有其它特殊使用场景(如高斯模糊、滤镜、特殊动画场景等)请使用 自定义配置 RequestOptions
方式或者自己添加扩展
- 常规加载
/**
* @param path
* @param cache 默认开启缓存
* @param isCenterCrop 默认图片的裁剪方式为CenterCrop
*/
fun ImageView.load(path: Any, cache: Boolean = true, isCenterCrop: Boolean = true) {
val request = get(path)
.placeholder(R.drawable.ic_placeholder_small)
.error(R.drawable.ic_placeholder_small)
if (isCenterCrop) request.centerCrop() // 默认FIT_CENTER
request.diskCacheStrategy(if (cache) DiskCacheStrategy.ALL else DiskCacheStrategy.NONE)
.into(this)
}
// 使用
imageView.load(data.path)
- 加载圆图
/**
* 圆图
*
* @param path
* @param cache 默认开启缓存
*/
fun ImageView.loadCircle(path: Any, cache: Boolean = true) {
getBitmap(path)
.placeholder(R.drawable.ic_placeholder_small)
.error(R.drawable.ic_placeholder_small)
.centerCrop()
.diskCacheStrategy(if (cache) DiskCacheStrategy.ALL else DiskCacheStrategy.NONE)
.into(object : BitmapImageViewTarget(this) {
override fun setResource(resource: Bitmap?) {
val circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.resources, resource)
circularBitmapDrawable.isCircular = true
[email protected](circularBitmapDrawable)
}
})
}
//使用
imageView.loadCircle(data.path)
- 加载圆角
/**
* 圆角
*
* @param path
* @param radious 圆角大小
* @param cache 默认开启缓存
*/
fun ImageView.loadRound(path: Any, radious: Float = 5F, cache: Boolean = true) {
getBitmap(path)
.placeholder(R.drawable.ic_placeholder_small)
.error(R.drawable.ic_placeholder_small)
.diskCacheStrategy(if (cache) DiskCacheStrategy.ALL else DiskCacheStrategy.NONE)
.into(object : BitmapImageViewTarget(this) {
override fun setResource(resource: Bitmap?) {
val circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.resources, resource)
val radiusPix = Resources.getSystem().displayMetrics.density * radious
circularBitmapDrawable.cornerRadius = radiusPix
circularBitmapDrawable.setAntiAlias(true)
[email protected](circularBitmapDrawable)
}
})
}
//使用
imageView.loadRound(data.path, 50F)
- 自定义配置 RequestOptions
fun ImageView.loadOptions(path: Any, options: RequestOptions) {
get(path).apply(options)
.into(this)
}
//使用
val options = RequestOptions()
.centerCrop()
.placeholder(com.ezbuy.android.R.drawable.ic_launcher)
.error(com.ezbuy.android.R.drawable.ic_launcher)
.priority(Priority.HIGH)
.diskCacheStrategy(DiskCacheStrategy.NONE)
imageView.loadOptions(data.path,options)
参考
Glide
Glide 中文文档
Glide Transformations