Android开发Android技术知识Android开发

Coil图片加载库

2023-01-05  本文已影响0人  奔跑吧李博

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

Coil的优势:

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(图片变换)
加载圆形、圆角图:
        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

上一篇下一篇

猜你喜欢

热点阅读