Glide 使用及图片加载框架的封装

作者:王俊

添加依赖

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 方式或者自己添加扩展

  1. 常规加载

/**
 * @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)

  1. 加载圆图
/**
 * 圆图
 *
 * @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)
  1. 加载圆角
/**
 * 圆角
 *
 * @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)

  1. 自定义配置 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

你可能感兴趣的:(Glide 使用及图片加载框架的封装)