Android 图片加载库之Coil详解与使用指南

这篇具有很好参考价值的文章主要介绍了Android 图片加载库之Coil详解与使用指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍

        在Android,资源的呈现主要有三大形式:文字、图片、视频。图片有分为本地资源和网络资源。

网络资源需要通过下载然后绑定到ImageView中。

        在前期我们使用的图片加载框架如:picasso、gliade、imageload。这些框架都可以满足我们正常的图片加载到显示,且这些框架都是通过Java语言开发出来。接下来,我将介绍一款以kotlin语言开发的框架Coil。

Coil的介绍

一、介绍

 是一个 Android 图片加载库,通过Kotlin协程的方式加载图片

优势

  • 更快:

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

  • 更轻量级:

    Coil 的包体很小,很多API依赖项目中的其他模块的框架(如:前提是你的 APP 里面集成了 OkHttp 和 Coroutines),Coil 和 Picasso 的方法数差不多,相比 Glide 和 Fresco 要轻量很多,kotlin的语法支持,代码更简洁。

  • 更容易使用:

    Coil 的 API 充分利用了 Kotlin 语言的新特性,简化和减少了很多样板代码,采用了类方法扩展,常用的API已通过ImageViews扩展到了ImageView中,可以直接使用

  • 更流行更新:

    Coil 首选 Kotlin 语言开发并且使用包含 Coroutines, OkHttp, Okio 和 AndroidX Lifecycles 在内最流行的开源库,很好的兼容最新Jetpack组件。

2、集成

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

//依赖库

    implementation("io.coil-kt:coil:1.2.2")
//    //选择添加
    implementation("io.coil-kt:coil-gif:1.2.2")//支持GIF
    implementation("io.coil-kt:coil-svg:1.2.2")//支持SVG
    implementation("io.coil-kt:coil-video:1.2.2")//支持Video


3、使用

由于在kotlin支持方法的扩展,所以ImageViews已支持提供了load方法,默认只需要传入图片地址即可。

@JvmSynthetic
inline fun ImageView.load(
    uri: String?,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(uri, imageLoader, builder)

/** @see ImageView.loadAny */
@JvmSynthetic
inline fun ImageView.load(
    url: HttpUrl?,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(url, imageLoader, builder)

/** @see ImageView.loadAny */
@JvmSynthetic
inline fun ImageView.load(
    uri: Uri?,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(uri, imageLoader, builder)

/** @see ImageView.loadAny */
@JvmSynthetic
inline fun ImageView.load(
    file: File?,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(file, imageLoader, builder)

/** @see ImageView.loadAny */
@JvmSynthetic
inline fun ImageView.load(
    @DrawableRes drawableResId: Int,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(drawableResId, imageLoader, builder)

/** @see ImageView.loadAny */
@JvmSynthetic
inline fun ImageView.load(
    drawable: Drawable?,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(drawable, imageLoader, builder)

/** @see ImageView.loadAny */
@JvmSynthetic
inline fun ImageView.load(
    bitmap: Bitmap?,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(bitmap, imageLoader, builder)


load支持的请求类型

uri: String:图片地址
url: HttpUrl:封装好的请求url
uri: Uri:Uri的资源封装
file: File:文件类型
drawableResId: Int:资源id
drawable: Drawable:drawable对象
bitmap: Bitmap:bitmap对象

Android图片加载库,Coil,图片加载库优势,图片加载库使用方法

加载load,返回一个Disposable,Disposable是IPC的接口,如下

interface Disposable {

    /**
     * Returns true if the request is complete or cancelling.
     */
    val isDisposed: Boolean

    /**
     * Cancels any in progress work and frees any resources associated with this request. This method is idempotent.
     */
    fun dispose()

    /**
     * Suspends until any in progress work completes.
     */
    @ExperimentalCoilApi
    suspend fun await()
}


通过Disposable可以判断是否完成,主动调用以及等待。

扩展:

Coil不仅提供了默认的加载,还可以扩展其他。

inline fun ImageView.load(
    uri: String?,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(uri, imageLoader, builder)


通过源码可以看到,requestbuild是支持扩展的。默认后面是{},可以在{}体中调用build中方法。

         bind.image.load(url){
                //build 扩展体
                crossfade(true) //渐进渐出
                placeholder(R.mipmap.ic_launcher) //加载中占位图
                error(R.mipmap.ic_launcher)  //加载失败占位图
                allowHardware(true)//硬件加速
                allowRgb565(true)//支持565格式

                lifecycle(lifecycle)//生命周期关联
                var default= DefaultRequestOptions()
                defaults(default)
            }


包括网络缓存等,我们可以自己根据业务配置。如果你需要可以自定义一个ImageRequest.Build

ImageView高阶变换

Transformation(图片变换)

  • BlurTransformation() : 高斯模糊变换

  • CircleCropTransformation() : 圆形裁剪变换

  • GrayscaleTransformation() : 灰度变换

  • RoundedCornersTransformation() : 圆角变换

Android图片加载库,Coil,图片加载库优势,图片加载库使用方法

 

高阶图片变形通过transformations()来完成,支持多样式。


Android图片加载库,Coil,图片加载库优势,图片加载库使用方法

 

BlurTransformation() : 高斯模糊变换

class BlurTransformation @JvmOverloads constructor(
    private val context: Context,
    private val radius: Float = DEFAULT_RADIUS,
    private val sampling: Float = DEFAULT_SAMPLING
)


 init {
        require(radius in 0.0..25.0) { "radius must be in [0, 25]." }
        require(sampling > 0) { "sampling must be > 0." }
    }


1.radius:模糊半径范围在0到25之间,数值越大,模糊越深

2.sampling:采样率必须大于,这个值是进行缩放图片大小的,(0,1),图片是越来越大,[1,++oo),图片是越来越小

Android图片加载库,Coil,图片加载库优势,图片加载库使用方法

 

GrayscaleTransformation() : 灰度变换

这个主要把彩色的图片置灰,常见特殊忌日,可以设置,利用了ColorMatrixColorFilter对颜色进行过滤。

RoundedCornersTransformation:圆角角度设置

class RoundedCornersTransformation(
    @Px private val topLeft: Float = 0f,
    @Px private val topRight: Float = 0f,
    @Px private val bottomLeft: Float = 0f,
    @Px private val bottomRight: Float = 0f
)


Android图片加载库,Coil,图片加载库优势,图片加载库使用方法

A=topleft ,B=topright,C=bottomLeft,D=bottomRight。

如果只传一个参数,默认就是四个角的角度,角度默认值是0,任何角的坐标都是(x,y),所以你设置角度无法只设置一个叫的一半。

如果想了解view的角度自定义,可以查看:

Android ImageView 四个角自定义角度,以及角度的变换_addroundrect_蜗牛、Z的博客-CSDN博客

 

参数扩展

有人用习惯了Glide或者imageload,会发现,可以通过配置来管理加载中,加载失败等标识,Coil同样也支持,只是通过build提供的方法来完成。

inline fun ImageView.load(
    uri: String?,
    imageLoader: ImageLoader = context.imageLoader,
    builder: ImageRequest.Builder.() -> Unit = {}
): Disposable = loadAny(uri, imageLoader, builder)


        bind.load.setOnClickListener {
            bind.image.load("https://www.toymoban.com/3a4114c916904ecbadb7a71b77294eef.gif"){
                crossfade(true) //渐进渐出
                placeholder(R.mipmap.ic_launcher) //加载中占位图
                error(R.mipmap.ic_launcher)  //加载失败占位图
                allowHardware(true)//硬件加速
//                transformations(BlurTransformation(context,25f,2f))
                //圆角
                transformations(RoundedCornersTransformation(90f,0f,0f,0f))
            }
        }


有人会有疑问:

builder: ImageRequest.Builder.() -> Unit = {}

这个写法,是返回builder类,通过指向类的内部方法来完成,最后返回build。

小试牛刀:

class Build {

      var msgs: String? = ""

    fun setMsg(msg: String) = apply {
        this.msgs = msg
    }
}



 文章来源地址https://www.toymoban.com/news/detail-477060.html

class TestBody(var build: Build.() -> Unit = {}) {

    fun log() {

        var mBuild = Build()
        mBuild.apply(build)
        mBuild.msgs?.let { MyLog.log(it) }
    }
}


fun main() {
    var test = TestBody({
        setMsg("hello")
    })

    test.log()
}


build是一个block object的,我们可以通过Build对象apply方法copy这个对象。

GIF动态图片加载

        Coil库不仅支持静态图片,也支持动态图片。只是动态和静态的解析对象不同ComponentRegistry在注册的时候,已提供了各种拦截与支持。

依赖库的引入:

implementation("io.coil-kt:coil-gif:1.2.2")//支持GIF


Android图片加载库,Coil,图片加载库优势,图片加载库使用方法

 

decoder目前提供两种方式:

api<28

/**
 * A [Decoder] that uses [Movie] to decode GIFs.
 *
 * NOTE: Prefer using [ImageDecoderDecoder] on API 28 and above.
 */
class GifDecoder : Decoder


api>=28

/**
 * A [Decoder] that uses [ImageDecoder] to decode GIFs, animated WebPs, and animated HEIFs.
 *
 * NOTE: Animated HEIF files are only supported on API 30 and above.
 */
@RequiresApi(28)
class ImageDecoderDecoder : Decoder


ImageLoad初始化:

注意GIFDecoder类的顶部注释:

NOTE: Prefer using ImageDecoderDecoder on API 28 and above.

        //创建 gif ImageLoader 实例
        val imageLoader = ImageLoader.Builder(applicationContext)
            .componentRegistry {
                if (SDK_INT >= 28) {
                    add(ImageDecoderDecoder(applicationContext))
                } else {
                    add(GifDecoder())
                }
            }.build()
        //设置全局唯一实例
        Coil.setImageLoader(imageLoader)


这样我们就完成了Gif的ImageLoader的设置

如何监听图片加载:

ImageRequest提供了fun listener(listener: Listener?) 方法。


bind.image.load("https://www.toymoban.com/3a4114c916904ecbadb7a71b77294eef.gif") {
  
                listener(object : ImageRequest.Listener {
                    override fun onCancel(request: ImageRequest) {
                        super.onCancel(request)
                    }

                    override fun onSuccess(request: ImageRequest, metadata: ImageResult.Metadata) {
                        super.onSuccess(request, metadata)
                    }

                    override fun onError(request: ImageRequest, throwable: Throwable) {
                        super.onError(request, throwable)
                    }

                    override fun onStart(request: ImageRequest) {
                        super.onStart(request)
                    }
                })
            }


关于配置

上面都是通过方法设置配置参数,如何设置全局配置?需要我们自己去设置一个全局的 ImageLoader.Builder

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

        val imageLoader = ImageLoader.Builder(this)
            .availableMemoryPercentage(0.5f)
            .diskCachePolicy(CachePolicy.ENABLED)  //磁盘缓策略 ENABLED、READ_ONLY、WRITE_ONLY、DISABLED
            .crossfade(true) //淡入淡出
            .okHttpClient {  //设置okhttpClient实例
                okHttpClient
            }.build()

        Coil.setImageLoader(imageLoader)


api介绍:

1.availableMemoryPercentage:

设置用于此 ImageLoader 的内存缓存和位图池的可用内存百分比,如果设置了百分百,那么cache将会失效

//源码
   fun availableMemoryPercentage(@FloatRange(from = 0.0, to = 1.0) percent: Double) = apply {
            require(percent in 0.0..1.0) { "Percent must be in the range [0.0, 1.0]." }
            this.availableMemoryPercentage = percent
            this.memoryCache = null
        }



2.memoryCachePolicy :

内存缓存策略,有4中策略;

Android图片加载库,Coil,图片加载库优势,图片加载库使用方法
3.diskCachePolicy: 

磁盘缓存策略,方式和内存策略一致;

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

短视频首帧

        Coil还有特别特别项,支持短视频首帧图片加载。正常在项目中,如果该项目有短视频业务,在视频不播放的状态下,如何获取首帧图片?这个问题是很多公司思考的问题。

        大公司在处理视频首帧都是通过服务器跑的。这样,在视频集在列表展示只处理单张图片即可。针对某一个视频,特别是小公司的时候,Coil明显很友好,可以在接收的范围类,降低技术和服务器的成本。

依赖库的引入:

implementation("io.coil-kt:coil-video:1.2.2")//支持Video


添加VideoDecoder

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

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


剩余的设置,都是通用设置,如果项目需要支持GIF、VideoFrame,可以同时支持进去,都是通过componentRegistry add添加,可以追加进去。


 

到了这里,关于Android 图片加载库之Coil详解与使用指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Web开发库之webargs使用详解

    在现代Web开发中,处理来自客户端的请求参数是一个常见任务。无论是在构建Web API、Web应用程序还是其他Web服务,都需要一种有效的方式来解析、验证和转换这些参数。Python的 Webargs 库是一个功能强大的工具,可以优雅地处理Web请求参数,使开发过程更加简单和可维护。本文

    2024年01月17日
    浏览(28)
  • Python UI框架库之kivy使用详解

    Python是一种广泛使用的编程语言,而Kivy是一个用于创建跨平台移动应用和多点触控应用的开源Python框架。Kivy的设计目标是提供一种简单而强大的方式来构建富有创意的用户界面和交互体验。本文将详细介绍Kivy的基本概念、核心特性、布局系统、用户界面设计和实际应用场景

    2024年04月16日
    浏览(22)
  • Python机器学习库之orange3使用详解

    数据科学和机器学习是当今科技领域的重要组成部分,而数据分析和建模通常是其中的关键步骤。Python Orange3 是一个功能强大且易于使用的开源工具,它结合了数据可视化、数据分析和机器学习,为数据科学家和分析师提供了一个全面的平台。本文将深入介绍 Python Orange3,包

    2024年01月24日
    浏览(27)
  • Python 数据可视化库之bokeh使用详解

    数据可视化在数据分析和报告中扮演着关键角色,而Python的Bokeh库为创建交互式、具有吸引力的可视化图表提供了强大的工具。本文将介绍Bokeh的基本概念、安装方法以及详细的示例代码,以帮助大家了解如何使用Bokeh创建出色的数据可视化。 Bokeh是一个Python库,用于创建交互

    2024年01月18日
    浏览(29)
  • Python处理日期和时间库之arrow使用详解

    日期和时间处理是许多应用程序中的常见任务,但在 Python 中,标准库中的  datetime  模块有时可能会让这些任务变得复杂和繁琐。幸运的是,有一个名为 Arrow 的第三方库,它提供了简化日期和时间处理的功能,使其更加直观和易用。本文将深入探讨 Arrow 库的基本概念、安装

    2024年01月25日
    浏览(28)
  • [Android]图片加载库Glide

    目录 Glide的介绍  Glide的基本使用   指定图片的格式 Glide占位符  指定图片的大小  过渡动画 图片变换 Generated API Glide的介绍 Glide是一个快速高效的Android图片加载库,可以自动加载网络,本地文件,app资源中的文件,注重于平滑的滚动。 开源地址:https://github.com/bumptech/gl

    2024年02月08日
    浏览(31)
  • PyAudio:Python库之PyAudio详解、安装和使用方法

    PyAudio:Python库之PyAudio详解、安装和使用方法 PyAudio是Python语言的一个开源库,它提供了一个跨平台的方式来录制和播放声音。你可以使用PyAudio库来处理音频数据,进行音频特征提取,并将声音数据与其他Python库集成。本文将为您介绍PyAudio的安装及使用方法。 一、PyAudio的安

    2024年02月09日
    浏览(28)
  • 【Shell 命令集合 系统设置 】Linux 加载和卸载内核模块 modprobe命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 modprobe命令是Linux系统中用于加载和卸载内核模块的工具。内核模块是一种可以动态加载到内核中的代码,它们可以扩展内核的功能,添加新的驱动程序或功能。 modprobe命令的主要作用有以下几个方面: 加载内核模块:modprobe命令可以根据

    2024年02月04日
    浏览(42)
  • Python 创建 Web 应用程序和用户界面库之flexx使用详解

    Flexx 是一个强大的 Python 库,用于创建交互式的 Web 应用程序和用户界面。它提供了灵活的组件和布局管理器,使开发者可以轻松构建具有丰富交互性和动态性的应用。本文将详细介绍 Flexx 库的特性、用法,并通过丰富的示例代码展示其在实际项目中的应用。 Flexx 是一个基于

    2024年04月17日
    浏览(55)
  • Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

    ListView  是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很好滚动流畅是做不到的 所以这里就需要把这些信息利用多线程实现异步加载 实现这样功能的

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包