Coil图片加载库

作者: 奔跑吧李博 | 来源:发表于2023-01-05 22:23 被阅读0次

    Coil 是一个 Android 图片加载库,通过Kotlin协程的方式加载图片。Coil 名字的由来:取 Coroutine Image Loader 首字母得来。

    Coil的优势:
    • 更快:
      Coil 在性能上有很多优化,包括内存缓存和磁盘缓存,把缩略图存保存在内存中,循环利用 bitmap,自动暂停和取消图片网络请求等。

    • 更轻量级:
      Coil 只有2000个方法(前提是你的 APP 里面集成了 OkHttp 和 Coroutines),Coil 和 Picasso 的方法数差不多,相比 Glide 和 Fresco 要轻量很多。

    • 更容易使用:
      Coil 的 API 充分利用了 Kotlin 语言的新特性,简化和减少了很多样板代码。

    • 更流行:
      Coil 首选 Kotlin 语言开发并且使用包含 Coroutines, OkHttp, Okio 和 AndroidX Lifecycles 在内最流行的开源库。

    Coil各个组件的作用:

    io.coil-kt:coil-base : 基础组件,提供了基本的图片请求、图片解码、图片缓存、Bitmap 复用等功能
    io.coil-kt:coil : 默认组件,依赖于io.coil-kt:coil-base,提供了 Coil 类的单例对象以及 ImageView 相关的扩展函数
    io.coil-kt:coil-gif : 包含两个 decoder 用于支持解码 GIFs
    io.coil-kt:coil-svg : 包含一个 decoder 用于支持解码 SVG
    io.coil-kt:coil-video : 包含两个 fetchers 用于支持读取和解码 任何 Android 的支持的视频格式 的视频帧

    使用场景:

    常规加载图片:
            imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp")
            imageView.load(R.mipmap.pic)
    

    为什么ImageView可以直接调用coil库的load加载,因为库里在ImageViews类中给ImageView写了多个重载的load方法,所以imageView能直接调用load。

    配置请求选项:
            imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
                crossfade(true) //渐进渐出
                placeholder(R.mipmap.ic_launcher) //加载中占位图
                error(R.mipmap.ic_launcher)  //加载失败占位图
            }
    
    Transformation(图片变换)
    • BlurTransformation() : 高斯模糊变换
    • CircleCropTransformation() : 圆形裁剪变换
    • GrayscaleTransformation() : 灰度变换
    • RoundedCornersTransformation() : 圆角变换
    加载圆形、圆角图:
            imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
                transformations(CircleCropTransformation())
                scale(Scale.FILL)
            }
    
            imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
                transformations(RoundedCornersTransformation(40f))
            }
    
    高斯模糊处理:
            imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
                transformations(BlurTransformation(applicationContext, 5f, 10f))
                scale(Scale.FILL)
            }
    
    灰色变换
            imageView.load("https://img.haomeiwen.com/i8669504/c3cb544ba9d7d67b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp") {
                transformations(GrayscaleTransformation())
            }
    
    加载Gif图
            //创建 gif ImageLoader 实例
            val imageLoader = ImageLoader.Builder(applicationContext)
                .componentRegistry {
                    if (SDK_INT >= 28) {
                        add(ImageDecoderDecoder(applicationContext))
                    } else {
                        add(GifDecoder())
                    }
                }.build()
            //设置全局唯一实例
            Coil.setImageLoader(imageLoader)
    
            imageView.load("https://img.haomeiwen.com/i8669504/3829dd776c830d04.gif?imageMogr2/auto-orient/strip|imageView2/2/w/216/format/webp")
        }
    
    监听下载过程
         imageView.load("https://img.haomeiwen.com/i8669504/3829dd776c830d04.gif?imageMogr2/auto-orient/strip|imageView2/2/w/216/format/webp") {
                listener(
                    onStart = { request ->
                        Log.i("minfo", "onStart")
                    },
                    onSuccess = { request, metadata ->
                        Log.i("minfo", "onSuccess")
                    },
                    onCancel = { request ->
                        Log.i("minfo", "onCancel")
                    },
                    onError = { request, throwable ->
                        Log.i("minfo", "onError")
                    }
                )
            }
    
    取消下载:
            val disposable = imageView.load("https://img.haomeiwen.com/i8669504/3829dd776c830d04.gif?imageMogr2/auto-orient/strip|imageView2/2/w/216/format/webp") 
            disposable.dispose()
    
    自定义属性

    底层使用okhttp作为网络请求工具,并使用缓存

            val okHttpClient = OkHttpClient.Builder()
                .cache(CoilUtils.createDefaultCache(this))
                .build()
    
            val imageLoader = ImageLoader.Builder(this)
                .availableMemoryPercentage(0.2)
                .diskCachePolicy(CachePolicy.ENABLED)  //磁盘缓策略 ENABLED、READ_ONLY、WRITE_ONLY、DISABLED
                .crossfade(true) //淡入淡出
                .crossfade(1000)  //淡入淡出时间
                .okHttpClient {  //设置okhttpClient实例
                    okHttpClient
                }.build()
    
            Coil.setImageLoader(imageLoader)
    

    availableMemoryPercentage 设置用于此 ImageLoader 的内存缓存和位图池的可用内存百分比;
    memoryCachePolicy 内存缓存策略,有4中策略;
    diskCachePolicy 磁盘缓存策略,方式和内存策略一致;

    缓存策略有如下几种:

    CachePolicy.ENABLED : 可读可写
    CachePolicy.READ_ONLY : 只读
    CachePolicy.WRITE_ONLY : 只写
    CachePolicy.DISABLED : 不可读不可写,即禁用

    参考:
    https://blog.csdn.net/zhaoyanjun6/article/details/122040645
    https://blog.csdn.net/weixin_42324979/article/details/117933094

    相关文章

      网友评论

        本文标题:Coil图片加载库

        本文链接:https://www.haomeiwen.com/subject/xecdcdtx.html