Android开发中使用Coil

Coil - Android开源图像加载库

Coil是一个开源的图像加载库,用于在Android中显示网络或本地图像资源。

为什么我们使用Coil?

  • 快速:Coil进行了许多优化,包括内存和磁盘缓存、内存中的图像降采样、自动暂停/取消请求等。
  • 轻量级:对于已经使用OkHttp和协程的应用程序来说,Coil会向您的APK添加大约2000个方法,与Picasso相当,明显少于Glide和Fresco。
  • 易于使用:Coil的API利用了Kotlin的语言特性,简洁而少量的样板代码。
  • 现代化:Coil以Kotlin为主,并使用包括协程、OkHttp、Okio和AndroidX Lifecycles在内的现代化库。

我们如何使用Coil?

  1. 通过将以下行添加到模块级build.gradle文件中,将Coil库引入项目。

    implementation("io.coil-kt:coil:2.5.0")
    
  2. 使用扩展函数是使用Coil加载图像的最简单方法。

   // 使用URL加载图像imageView.load("https://example.com/image.jpg")// 使用文件加载图像imageView.load(File("/path/to/image.jpg"))// 从Android资源(drawable)中加载图像imageView.load(R.drawable.person)
  1. 我们可以自定义请求
   imageView.load("https://example.com/image.jpg") { crossfade(true)crossfade(500)placeholder(R.drawable.person)}

创建自定义图像加载器

我们可以根据项目需求创建一个自定义图像加载器。如果我们不创建一个新的加载器,Coil将使用其内置的图像加载器以及默认选项。

class MainApplication : Application(), ImageLoaderFactory {override fun newImageLoader(): ImageLoader {return ImageLoader.Builder(this.applicationContext).crossfade(true).build()}
}

为图像加载器添加日志拦截器

创建一个自定义的日志类,它扩展了Interceptor并实现所需的方法。

class CoilLoggingInterceptor : Interceptor {companion object {val TAG: String = CoilLoggingInterceptor::class.java.simpleName}override suspend fun intercept(chain: Interceptor.Chain): ImageResult {val logModel = CoilLogModel(url = chain.request.data.toString(),width = chain.size.width.toString(),height = chain.size.height.toString())Log.d(TAG, logModel.toString())return chain.proceed(chain.request)}data class CoilLogModel(val url: String,val width: String,val height: String) {override fun toString(): String {return """URL: $urlwidth: $widthheight: $height""".trimIndent()}}
}

然后添加拦截器和自定义图像加载器

class MainApplication : Application(), ImageLoaderFactory {override fun newImageLoader(): ImageLoader {return ImageLoader.Builder(this.applicationContext).components {add(CoilLoggingInterceptor())}.build()}
}

示例结果如下:

创建一个自定义转换器

class GrayscaleTransformation() : Transformation {override val cacheKey: String = GrayscaleTransformation::class.java.nameoverride suspend fun transform(input: Bitmap, size: Size): Bitmap {val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)paint.colorFilter = COLOR_FILTERval output = createBitmap(input.width, input.height, input.config)output.applyCanvas {drawBitmap(input, 0f, 0f, paint)}return output}override fun equals(other: Any?) = other is GrayscaleTransformationoverride fun hashCode() = javaClass.hashCode()override fun toString() = "GrayscaleTransformation()"private companion object {val COLOR_FILTER = ColorMatrixColorFilter(ColorMatrix().apply { setSaturation(0f) })}
}

然后添加转换器到你的loader

// extension for image view
fun ImageView.loadGrayscaleImage(url: String) = this.load(url) {transformations(GrayscaleTransformation())
}// binding adapter for xml layout
@BindingAdapter("load_grayscale_image")
fun loadGrayscaleImage(view: ImageView, url: String) {view.loadGrayscaleImage(url)
}


有用的扩展函数和绑定适配器(Extensions and Binding Adapters)可用于Coil:

  1. 加载图像而不进行任何更改:
//binding adapter for xml layout
@BindingAdapter("load_image")
fun loadImage(view: ImageView, url: String) {view.load(url)
}

  1. 加载圆形图像
// extension for imageview
fun ImageView.loadCircularImage(url: String) = this.load(url) {transformations(CircleCropTransformation())
}// binding adapter for xml layouts
@BindingAdapter("load_circular_image")
fun loadCircularImage(view: ImageView, url: String) {view.loadCircularImage(url)
}

  1. 加载圆形边角图像
// extension for image view
fun ImageView.loadRoundedImage(url: String) = this.load(url) {transformations(RoundedCornersTransformation(30f, 30f, 30f, 30f))
}// binding adapter for xml layout
@BindingAdapter("load_rounded_image")
fun loadRoundedImage(view: ImageView, url: String) {view.loadRoundedImage(url)
}

  1. 加载模糊图像
// extension for image view
fun ImageView.loadBlurredImage(url: String) = this.load(url) {listener(onSuccess = { _, _ ->if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {setRenderEffect(RenderEffect.createBlurEffect(10f, 10f, Shader.TileMode.MIRROR))}})
}// binding adapter for xml layout
@BindingAdapter("load_blurred_image")
fun loadBlurredImage(view: ImageView, url: String) {view.loadBlurredImage(url)
}

Github

https://github.com/hakandindis/CoilAndroidExamples
https://coil-kt.github.io/coil
https://github.com/Commit451/coil-transformations

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/313571.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++每日一练(10):线性查找

题目描述 输入n个数和一个需要查找的目标数&#xff0c;进行线性查找。 输入 第一行输入n&#xff08;1<n<1000&#xff09;&#xff0c; 第二行输入n个整数&#xff0c; 第三行输入要查找的目标数t。 输出 输出查找到的目标数的排序号&#xff0c;若查不到则输出no。 输…

Linux 安装Jupyter notebook 并开启远程访问

文章目录 安装Python安装pip安装Jupyter启动Jupyter Notebook1. 生成配置文件2. 创建密码3. 修改jupyter notebook的配置文件4. 启动jupyter notebook5. 远程访问jupyter notebook 安装Python 确保你的系统上已经安装了Python。大多数Linux发行版都预装了Python。你可以在终端…

基于Java SSM框架实现房屋租赁合同系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现房屋租赁合同系统演示 摘要 在网络高速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;人们对房屋租赁系统越来越重视&#xff0c;更好的…

【2023年终总结】 | 时光之舟:乘载着回忆与希望穿越2023,抵达2024

文章目录 1 回忆2 希望 1 回忆 2023年对我来说是非常梦幻的一年&#xff0c;我在2023年初的时候确认去做AI方向&#xff0c;在这之前我尝试了前端开发&#xff0c;移动App开发&#xff0c;云FPGA等方向&#xff0c;但是感觉自己都不是很喜欢&#xff0c;然后就开始尝试新的方向…

软件测试/测试开发丨Python 模块与包 学习笔记

python的程序结构 组成&#xff1a; packagemodulefunction 模块 模块是在代码量变得相当⼤了之后&#xff0c;为了将需要重复使⽤的有组织的代码放在⼀起&#xff0c;这部分代码可以被其他程序引⽤&#xff0c;从⽽使⽤该模块⾥的函数等功能&#xff0c;引⽤的过程叫做导…

了解.NET 通用主机

写在前面 .NET 通用主机负责应用启动和生存期管理&#xff0c;主机是封装应用资源和生存期功能的对象&#xff0c;通用主机可用于其他类型的 .NET 应用程序&#xff0c;如控制台应用&#xff1b;.NET 通用主机基于类库Microsoft.Extensions.Hosting 来实现&#xff0c;本文记录…

WINDOWS 批量修改图片文件名称(流星程序集之二十)

博主家里有一台电脑&#xff0c;存放家庭全部的照片和视频&#xff0c;从智能手机和3G网络发展开始&#xff0c;家里的照片和视频越来越多&#xff0c;已经达到上万个文件。终于&#xff0c;博主找到一个方法整理和保存这些珍贵的数据资料。 一、按年代目录整理照片和视频 按年…

RFC7636-PKCE

前言 PKCE &#xff08;RFC 7636&#xff09; 是授权代码流的扩展&#xff0c;用于防止 CSRF 和授权代码注入攻击。 PKCE 不是客户端身份验证的一种形式&#xff0c;PKCE 不能替代客户端密码或其他客户端身份验证。即使客户端使用客户端密码或其他形式的客户端身份验证&#…

面向对象知识点

类和对象知识点梳理 1. 类和对象的概念 类是对一类事物的描述&#xff0c;是抽象的、概念上的定义。Java 中定义类的关键字是&#xff1a;class。 具有相同特征和行为的对象抽象成类&#xff0c;类描述了这一类对象的属性和方法&#xff1a; 属性&#xff08;成员变量&#x…

软件测试/测试开发丨接口测试之Postman 安装与使用

Postman 安装 官网下载地址 www.postman.com/downloads Postman 使用 发送get请求 新建请求 填写请求方式&#xff1a;GET 填写请求 URL&#xff1a; ceshiren.com/httpbin.ceshiren.com/get 填写请求参数&#xff1a; para_key para_value 发送 POST 请求 请求方式&…

Python数值型字符串校验(try异常拦截解析)

从键盘输入一行字符串&#xff0c;编写Python代码判定字符串是python“合法”数值。 (笔记模板由python脚本于2023年12月25日 18:00:52创建&#xff0c;本篇笔记适合熟悉Python符串基本数据类型的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.py…

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(3)-训练yolov5模型(本地)

训练yolov5模型&#xff08;本地&#xff09; 训练文件 train.py训练如下图 一些参数的设置weights:对于weight参数&#xff0c;可以往Default参数中填入的参数有 cfg&#xff1a;&#xff08;缩写&#xff09;cfg参数可以选择的网络模型 data对于data hyp 超参数epochs 训练多…