您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

Android妙用的图片加载框架——Coil使用与解析

时间:2022-10-18 16:01:21  来源:CSDN  作者:

简介

Coil 是一个 Android 图片加载库,通过 Kotlin 协程的方式加载图片。特点如下:

  • 更快: Coil 在性能上有很多优化,包括内存缓存和磁盘缓存,把缩略图存保存在内存中,循环利用 bitmap,自动暂停和取消图片网络请求等。
  • 更轻量级: Coil 只有2000个方法(前提是你的 App 里面集成了 OkHttp 和 Coroutines),Coil 和 Picasso 的方法数差不多,相比 Glide 和 Fresco 要轻量很多。
  • 更容易使用: Coil 的 API 充分利用了 Kotlin 语言的新特性,简化和减少了很多样板代码。
  • 更流行: Coil 首选 Kotlin 语言开发并且使用包含 Coroutines, OkHttp, Okio 和 AndroidX Lifecycles 在内最流行的开源库。 Coil 名字的由来:取 Coroutine Image Loader 首字母得来。

添加依赖:

implementation("io.coil-kt:coil:1.4.0")

简单使用

// URL
imageView.load("https://www.example.com/image.jpg")

// Resource
imageView.load(R.drawable.image)

// File
imageView.load(File("/path/to/image.jpg"))

// And more...

可以使用 lambda 语法轻松配置请求选项:

imageView.load("https://www.example.com/image.jpg") {
    crossfade(true) //渐进进出
    placeholder(R.drawable.image) //加载中占位图
    transformations(CircleCropTransformation())  //圆形图
    error(R.drawable.image) //加载错误占位图
}

高斯模糊

//正常图片
mBinding.image1.load(imageUrl)

//高斯模糊-轻微模糊
mBinding.image11.load(imageUrl) {
     transformations(BlurTransformation(this@MAInActivity, 5f, 10f))
     scale(Scale.FILL)
}

//高斯模式-严重模糊
mBinding.image12.load(imageUrl) {
     transformations(BlurTransformation(this@MainActivity, 20f, 40f))
     scale(Scale.FILL)
 }

效果图:

 

圆角

        //没有圆角
        mBinding.image1.load(imageUrl){
            transformations(RoundedCornersTransformation())
            scale(Scale.FILL)
        }

        //圆角一样
        mBinding.image11.load(imageUrl) {
            transformations(RoundedCornersTransformation(20f))
            scale(Scale.FILL)
        }

        //圆角不一样
        mBinding.image12.load(imageUrl) {
            transformations(
                RoundedCornersTransformation(
                    topLeft = 20f,
                    topRight = 20f,
                    bottomLeft = 50f,
                    bottomRight = 50f
                )
            )
            scale(Scale.FILL)
        }

效果图:

 

圆形

布局文件

<ImageView
     android:id="@+id/image1"
     android:layout_gravity="center"
     android:layout_width="150dp"
     android:layout_height="150dp" />

代码:

mBinding.image1.load(imageUrl){
     transformations(CircleCropTransformation())
     scale(Scale.FILL)
}

效果图:

 

灰色变换 GrayscaleTransformation

简单来说就是把彩色图变成灰色的

mBinding.image1.load(imageUrl) {
    transformations(GrayscaleTransformation())
}

效果图:

 

Gif

添加依赖

implementation("io.coil-kt:coil-gif:1.4.0")

官方文档:
https://coil-kt.Github.io/coil/gifs/

创建 gif ImageLoader 实例

val imageLoader = ImageLoader.Builder(context)
    .componentRegistry {
        if (SDK_INT >= 28) {
            add(ImageDecoderDecoder(context))
        } else {
            add(GifDecoder())
        }
    }
    .build()

 //设置全局唯一实例
 Coil.setImageLoader(imageLoader)

加载 gif 图片:

mBinding.image1.load(gifUrl)

效果图如下:

 

监听下载过程

mBinding.image1.load(imageUrl) {
      listener(
           onStart = { request ->
               Log.d("coil-", "onStart")
            },
           onError = { request, throwable ->
               Log.d("coil-", "onError")
           },
           onCancel = { request ->
               Log.d("coil-", "onCancel")
           },
           onSuccess = { request, metadata ->
               Log.d("coil-", "onSuccess")
           }
       )
}

取消下载

val imageUrl = "https://t7.baidu.com/it/u=433422559,1779762296&fm=193&f=GIF"

val disposable = mBinding.image1.load(imageUrl)

//取消加载
disposable.dispose()

替换 okhttp 实例

coil 底层是使用 okhttp 作为网络请求工具,可以设置 okHttpClient 实例

val okHttpClient = OkHttpClient.Builder()
       .cache(CoilUtils.createDefaultCache(this))
       .build()

val imageLoader = ImageLoader.Builder(this).okHttpClient {
     okHttpClient
}.build()

Coil.setImageLoader(imageLoader)

自定义

  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 的内存缓存和位图池的可用内存百分比,范围:0-1 , 如果为0 , 则禁用内存缓存。

默认行为:

 

memoryCachePolicy 内存缓存策略,有4中策略,默认为 CachePolicy.ENABLED

 

diskCachePolicy 磁盘缓存策略,方式和内存策略一直

crossfade 开启淡入淡出

Coil 源码分析

Coil 是一个单例类

 

转载请标明出处:
http://blog.csdn.NET/zhaoyanjun6/article/details/122040645

本文出自【赵彦军的博客】

文末

Coil是Android上的一个全新的图片加载框架,全名叫做 coroutine image loader,即协程图片加载库。与传统的图片加载库Glide,Picasso或Fresco等相比。该具有轻量(只有大约1500个方法)、快、易于使用、更现代的API等优势。

它支持GIF和SVG,并且可以执行四个默认转换:模糊,圆形裁剪,灰度和圆角。



Tags:Coil使   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Android妙用的图片加载框架——Coil使用与解析
简介Coil 是一个 Android 图片加载库,通过 Kotlin 协程的方式加载图片。特点如下:更快: Coil 在性能上有很多优化,包括内存缓存和磁盘缓存,把缩略图存保存在内存中,循环利用 bitm...【详细内容】
2022-10-18  Search: Coil使  点击:(589)  评论:(0)  加入收藏
▌简易百科推荐
Android Emulator黑屏怎么办 Android模拟器黑屏解决方法
Android Emulator黑屏问题困扰了非常多的玩家,Android Emulator作为一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序,但是程序本身不是很稳定,很容易会出现黑屏,启动不了...【详细内容】
2024-03-04  18183游戏网    Tags:Android Emulator   点击:(37)  评论:(0)  加入收藏
Android开发中常见的Hook技术有哪些?
Hook技术介绍Hook技术是一种在软件开发中常见的技术,它允许开发者在特定的事件发生时插入自定义的代码逻辑。常见的应用场景包括在函数调用前后执行特定的操作,或者在特定的事...【详细内容】
2023-12-25  沐雨花飞蝶  微信公众号  Tags:Android   点击:(86)  评论:(0)  加入收藏
在Android应用开发中使用NFC功能
NFC介绍NFC是指“近场通讯”(Near Field Communication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他...【详细内容】
2023-12-22  沐雨花飞蝶  微信公众号  Tags:Android   点击:(102)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  沐雨花飞蝶  微信公众号  Tags:Android   点击:(99)  评论:(0)  加入收藏
Android开发中如何进行单元测试?
单元测试介绍单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数或方法)是否按预期工作。单元测试通常由开发人员编写,旨在隔离和测试代码的特定部...【详细内容】
2023-12-11  沐雨花飞蝶  微信公众号  Tags:Android   点击:(168)  评论:(0)  加入收藏
一篇聊聊Jetpack Room实现数据存储持久性
Room介绍Room 是 Android Jetpack 组件库中的一部分,它是用于在 Android 应用中进行本地数据库访问和管理的库。Room 提供了一个抽象层,使开发者能够更轻松地访问 SQLite 数据...【详细内容】
2023-12-08  沐雨花飞蝶  微信公众号  Tags:Jetpack   点击:(143)  评论:(0)  加入收藏
了解Android系统架构中的HAL硬件抽象层
在Android系统中,HAL的存在使得不同厂商的硬件可以统一被上层的应用程序调用,从而提高了系统的兼容性和可移植性。HAL还可以帮助开发者更方便地开发应用程序,因为他们不需要为...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:Android   点击:(203)  评论:(0)  加入收藏
我们一起聊聊 IntentService 与 Service 的区别?
Service介绍Service组件是Android应用开发中的四大组件之一,用于在后台执行长时间运行的操作或处理远程请求。它可以在没有用户界面的情况下执行任务,并且可以与其他应用组件...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:IntentService   点击:(171)  评论:(0)  加入收藏
Android数据对象序列化原理与应用
序列化与反序列化「序列化」是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换...【详细内容】
2023-11-14  沐雨花飞蝶  微信公众号  Tags:Android   点击:(273)  评论:(0)  加入收藏
你了解Android中的SELinux吗?
SELinux介绍SELinux(Security-Enhanced Linux)是一种安全增强的Linux操作系统,它通过强制访问控制(MAC)机制来提供更高级别的系统安全保护。相比于传统的Linux访问控制机制(DAC),SEL...【详细内容】
2023-11-09  沐雨花飞蝶  微信公众号  Tags:Android   点击:(268)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条