Android图片加载框架库源码解析 - Coil

news2024/11/15 23:43:29

文章目录

  • 一、什么是Coil
  • 二、引入Coil
    • 1、ImageView加载图片
      • 1.1、普通加载
      • 1.2、crossfade(淡入淡出)加载
      • 1.3、crossfade的动画时间
      • 1.4、placeholder
      • 1.5、error
      • 1.6、高斯模糊
      • 1.7、灰度变换
      • 1.8、圆形
      • 1.9、圆角
    • 2、Gif加载
    • 3、SVG加载(不存在)
    • 4、视频帧加载
    • 5、监听下载过程
    • 6、取消下载
    • 7、替换 okhttp 实例
    • 8、自定义

一、什么是Coil

Coil是一个Android开源的图片加载库,使用Kotlin协程来加载图片Coil在 2020 年 10 月 22 日才发布了 1.0.0 版本,但却受到了 Android官方的推广,Coil有以下几个特点:

  • 更快Coil在性能上做了很多优化,包括内存缓存和磁盘缓存、对内存中的图片进行采样、复用Bitmap、支持根据生命周期变化自动暂停和取消图片请求等
  • 更轻量级Coil大约会给你的App增加两千个方法(前提是你的 App 已经集成了OkHttpCoroutines),Coil的方法数和Picasso相当,相比GlideFresco要轻量级很多
  • 更容易使用Coil’s API 充分利用了Kotlin语言的新特性,简化并减少了很多重复代码
  • 更流行Coil首选Kotlin语言开发,并且使用包含 CoroutinesOkHttpOkioAndroidX Lifecycles 在内的更现代化的开源库

Coil的首字母由来:Coroutine,Image 和Loader 得到 Coil
Coil开源库github地址:https://github.com/coil-kt/coil
Coil官方文档:https://coil-kt.github.io/coil

二、引入Coil

Coil要求AndroidXJava 8+环境

app/build.gradleCoil依赖包

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

AndroidManifest.xml中加上网络权限

<uses-permission android:name="android.permission.INTERNET" />

1、ImageView加载图片

activity_main.xml中声明ImageView,并使用CoilImageView加载图片:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="点击" />
</LinearLayout>

1.1、普通加载

	val url = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {
            imageView.load(url)
        }
  • 通过扩展方法load加载url
  • 除了String以外,还支持HttpUrlUrlFileDrawableRes IntDrawableBitmap等各种类型的加载

举例子:

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

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

1.2、crossfade(淡入淡出)加载

	val url = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        reloadButton.setOnClickListener {
            imageView.load(url) {
                crossfade(true)
            }
        }

1.3、crossfade的动画时间

	val url = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        reloadButton.setOnClickListener {
            imageView.load(url) {
                crossfade(3000)
            }
        }

1.4、placeholder

placeholder预置展位图

	val url = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {
            imageView.load(url) {
                placeholder(R.drawable.placeholder)
                crossfade(3000)
            }
        }

1.5、error

加载失败时的错误占位图片

	val url = "https://notfound.png"
    ......
        button.setOnClickListener {
            imageView.load(url) {
                error(R.drawable.error)
            }
        }

1.6、高斯模糊

BlurTransformation: 高斯模糊变换
activity_main.xml代码中把ImageView的高度设置成300dp

	val url = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {
            imageView.load(url) {
                transformations(BlurTransformation(context = applicationContext, radius = 5f, sampling = 5f))
            }
        }

1.7、灰度变换

GrayscaleTransformation:灰度变换

	val url = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {
            imageView.load(url) {
                transformations(GrayscaleTransformation())
            }
        }

1.8、圆形

CircleCropTransformation:圆形变换

	val url = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {
            imageView.load(url) {
                transformations(CircleCropTransformation())
            }
        }

1.9、圆角

RoundedCornersTransformation:圆角矩形变换

	val url = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {
            imageView.load(url) {
                transformations(
                    RoundedCornersTransformation(
                        topLeft = 10f,
                        topRight = 10f,
                        bottomLeft = 10f,
                        bottomRight = 10f
                    )
                )
            }
        }

上面左右可以设置圆角:topLeft = 10f,topRight = 10f,bottomLeft = 0f,bottomRight = 0f

下面左右可以设置圆角:topLeft = 0f,topRight = 0f,bottomLeft = 10f,bottomRight = 10f

2、Gif加载

添加依赖包:

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

官方文档:https://coil-kt.github.io/coil/gifs/
创建 gif ImageLoader 实例

	private val gifUrl = "https://img.zcool.cn/community/01ca905aebe350a801219b7f53a0e4.gif"
    ......
        button.setOnClickListener {

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

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

            imageView.load(gifUrl) //加载gif图片
        }
    }

效果图如下:

3、SVG加载(不存在)

Coil也可以进行SVG加载的,同gif一样,也是需要添加extend包的:

implementation("io.coil-kt:coil-svg:1.2.2")//支持SVG

代码不存在了

4、视频帧加载

implementation("io.coil-kt:coil-video:1.2.2")//支持Video
private val videoUrl = "https://vd4.bdstatic.com/mda-jbppbefbbztvws50/sc/mda-jbppbefbbztvws50.mp4"
    ......
        button.setOnClickListener {

            //创建 gif ImageLoader 实例
            val imageLoader = ImageLoader.Builder(applicationContext)
                .componentRegistry {
                    add(VideoFrameDecoder(this@MainActivity))
                }.build()

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

            imageView.load(videoUrl)
        }
    }

5、监听下载过程

	private val imageUrl = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {
            imageView.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")
                    }
                )
            }
        }

点击“点击”按钮后图片加载成功,可以看Logcat窗口中打印:
在这里插入图片描述

6、取消下载

	private val imageUrl = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {
            val disposable = imageView.load(imageUrl)
            //取消加载
            disposable.dispose()
        }

7、替换 okhttp 实例

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

	private val imageUrl = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {

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

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

            Coil.setImageLoader(imageLoader)

            imageView.load(imageUrl)
        }

8、自定义

	private val imageUrl = "https://img-blog.csdnimg.cn/20210124002108308.png"
    ......
        button.setOnClickListener {

            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)
            imageView.load(imageUrl)

        }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想翻译pdf文档,试了几个工具对比:有阿里(完全免费,快,好用,质量高,不用注册登录)道最好(有限免费) 百度(有限免费)和谷歌完全免费(网不好)

文档翻释作为基础设施&#xff0c;工作必备。 阿里 &#xff08;完全免费&#xff0c;快&#xff0c;好用&#xff0c;质量高&#xff0c;不用注册登录&#xff0c;无广告&#xff09;我给满分 https://translate.alibaba.com/#core-translation 先选好语言。 Google(完全免…

PDManer生成Postgis对应Schema数据库设计文档

项目开发数据库选择postGis&#xff0c;由于需要编写数据库设计说明书&#xff0c;因此选择工具PDManer生成数据库设计文档&#xff0c;但是postGis一个数据库&#xff0c;可能对应多个Schema。如下图所示&#xff1a; 1.编写数据库设计文档时&#xff0c;仅需编写hly这个Sche…

美妆造型教培服务预约小程序的作用是什么

美业市场规模很高&#xff0c;细分类目更是比较广&#xff0c;而美妆造型就是其中的一类&#xff0c;从业者也比较多&#xff0c;除了学校科目外&#xff0c;美妆造型教培机构也有生意。 对机构来说主要目的是拓客引流-转化及赋能&#xff0c;而想要完善路径却是不太容易&…

Ubuntu16.04 python matplotlib 坐标轴标签出现中文乱码

问题&#xff1a;坐标轴打印中文时&#xff0c;显示会乱码 import matplotlib.pyplot as plt plt.ylabel(时间刻度)原因&#xff1a;matplotlib里面没有中文字体解决方法&#xff1a;下载SimHei字体&#xff0c;快捷方法是使用everything直接在windows搜索simhei.ttf&#xff…

计算机基础知识41

前端 # 前端是所有跟用户直接打交道 比如&#xff1a;PC页面、手机页面、汽车显示屏&#xff0c;肉眼可以看见的 # 后端&#xff1a;一堆代码&#xff0c;用户不能够直接看到&#xff0c;不直接与用户打交道 常见的后端&#xff1a;Python、Java、Go等 # 学了前端就可以做全栈…

0004net程序设计-抗疫物资

文章目录 **摘** **要**目 录系统设计开发环境 摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;抗疫物资管理系统利用计算机网络实现信息化管理&#xff0c;使整个抗疫物资管理…

Kafka - 3.x 分区分配策略及再平衡不完全指北

文章目录 生产经验——分区分配策略及再平衡生产者分区分配之Range及再平衡Range分区策略原理Range分区分配策略及再平衡案例 生产者分区分配之RoundRobin策略及再平衡RoundRobin分区策略原理RoundRobin分区分配策略及再平衡案例 生产者分区分配之Sticky及再平衡Sticky分区策略…

网络协议--TCP的超时与重传

21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认&#xff0c;它就重传该数据。对任何实现而言&#xff0c;关键之处就在于超时和重…

Android NDK开发详解之Android.mk探秘

Android NDK开发详解之Android.mk探秘 概览基础知识变量和宏NDK 定义的 include 变量CLEAR_VARSBUILD_EXECUTABLEBUILD_SHARED_LIBRARYBUILD_STATIC_LIBRARYPREBUILT_SHARED_LIBRARYPREBUILT_STATIC_LIBRARY 目标信息变量TARGET_ARCHTARGET_PLATFORMTARGET_ABI 模块描述变量LOC…

ubuntu下英伟达显卡驱动及cuda安装

一、查看显卡需要安装的cuda版本及需要的驱动版本 进入官网查看&#xff1a; CUDA 12.3 Release Notes 比如需要装cuda12.2GA需要驱动版本至少为535.54.03 二、下载显卡驱动 2.1 进入官网下载界面&#xff1a; Official Drivers | NVIDIA&#xff0c;点击Beta and older dr…

系列三十三、代理(三)动态代理

一、概述 在实际开发过程中&#xff0c;往往我们自己不会去创建代理类&#xff0c;而是通过JDK提供的Proxy类在程序运行时&#xff0c;运用反射机制动态创建而成&#xff0c;这就是所谓的动态代理。 1.1、动态代理 vs 静态代理 静态代理需要程序员自己写代理类&#xff0c;动态…

软件测试面试百问:如何测试App性能?

APP性能测试几乎是客户端面试必问。 为什么要做App性能测试 如果APP总是出现卡顿或网络延迟的情况&#xff0c;降低了用户的好感&#xff0c;用户可能会抛弃该App&#xff0c;换同类型的其他应用。如果APP的性能较好&#xff0c;用户体验高&#xff0c;使用起来丝滑顺畅&…

干货:传统软文和新媒体软文的区别在哪儿

其实早在古代就有软文的影子&#xff0c;不管是“借问酒家何处有&#xff0c;牧童遥指杏花村”&#xff0c;还是“日啖荔枝三百颗,不辞长作岭南人。”都有软文的影子。今天媒介盒子就来和大家聊聊&#xff0c;传统软文和新媒体软文的区别在哪儿&#xff1f; 一、 渠道不同 在…

UWB智能制造

&#xff08;一&#xff09;无人值守的人、车、物出入监控 &#xff08;二&#xff09;人、车、物授权区域进出监控 &#xff08;三&#xff09;固定资产区域盘点及移动盘点 &#xff08;四&#xff09;人、车、物作业现场网格化管理 &#xff08;五&#xff09;作业现场人车、…

万兆光模块是否能够应对未来网络的需求?

万兆光模块目前已经是数据中心等高性能计算场景中的标配之一&#xff0c;其传输速率可以满足大量的数据传输需求。随着网络的发展&#xff0c;光模块的传输速率也在不断提升。目前一些厂商已经推出了400G和800G光模块&#xff0c;同时更高速率光模块也在加速研发中。可以预见&a…

原型和原型链的理解

记住一句话&#xff1a;万物皆对象 对于原型和原型链&#xff0c;我们要知道一下几个&#xff1a;函数对象&#xff0c;实例对象、原型对象 1&#xff09;函数对象——就是平时称的对象&#xff1b; 2&#xff09;实例对象——new出的对象或者{ }&#xff1b; 3&#xff09;原型…

医疗安全不良事件管理系统源码(PHP+ vue+laravel)

医疗安全不良事件管理系统全套源码 不良事件上报系统源码 不良事件管理系统帮助医院梳理建立不良事件上报与管理的一体化解决方案&#xff0c;包含上报内容、归口科室、上报流程及管理办法。提供面向医院的不良事件全过程管理平台&#xff0c;包含事件上报、事件处理、事件追踪…

线性代数 第一章 行列式

一、概念 不同行不同列元素乘积的代数和&#xff08;共n!项&#xff09; 二、性质 经转置行列式的值不变&#xff0c;即&#xff1b; 某行有公因数k&#xff0c;可把k提到行列式外。特别地&#xff0c;某行元素全为0&#xff0c;则行列式的值为0&#xff1b; 两行互换行列式…

goland setup go env

go env -w设置的变量&#xff0c;在goland中不生效&#xff0c;需要额外配置。 点击goland->preference&#xff0c;在go module里&#xff0c;设置go环境变量即可。

Istio实战(九)-Envoy 流量劫持

前言 Envoy 是一款面向 Service Mesh 的高性能网络代理服务。它与应用程序并行运行,通过以平台无关的方式提供通用功能来抽象网络。当基础架构中的所有服务流量都通过 Envoy 网格时,通过一致的可观测性,很容易地查看问题区域,调整整体性能。 Envoy也是istio的核心组件之一…