Android進階之Coil-為kotlin而生的圖片庫詳解
本文轉(zhuǎn)載自微信公眾號「Android開發(fā)編程」,作者Android開發(fā)編程。轉(zhuǎn)載本文請聯(lián)系A(chǔ)ndroid開發(fā)編程公眾號。
前言
Coil是Android上的一個全新的圖片加載框架,它的全名叫做coroutine image loader,即協(xié)程圖片加載庫;
與傳統(tǒng)的圖片加載庫Glide,Picasso或Fresco等相比。該具有輕量(只有大約1500個方法)、快、易于使用、更現(xiàn)代的API等優(yōu)勢;
它支持GIF和SVG,并且可以執(zhí)行四個默認(rèn)轉(zhuǎn)換:模糊,圓形裁剪,灰度和圓角。并且是全用Kotlin編寫,如果你是純Kotlin項目的話,那么這個庫應(yīng)該是你的首選;
一、Coil介紹和使用
1、Coil介紹
Coil 是一個 Android 圖片加載庫,通過 Kotlin 協(xié)程的方式加載圖片。特點如下:
- 更快: Coil 在性能上有很多優(yōu)化,包括內(nèi)存緩存和磁盤緩存,把縮略圖存保存在內(nèi)存中,循環(huán)利用 bitmap,自動暫停和取消圖片網(wǎng)絡(luò)請求等;
 - 更輕量級:Coil 只有2000個方法(前提是你的 APP 里面集成了 OkHttp 和 Coroutines),Coil 和 Picasso 的方法數(shù)差不多,相比 Glide 和 Fresco 要輕量很多;
 - 更容易使用: Coil 的 API 充分利用了 Kotlin 語言的新特性,簡化和減少了很多樣板代碼;
 - 更流行: Coil 首選 Kotlin 語言開發(fā)并且使用包含 Coroutines, OkHttp, Okio 和 AndroidX Lifecycles 在內(nèi)最流行的開源庫;
 
2、使用
①Coil 可以在 mavenCentral() 下載
- implementation("io.coil-kt:coil:1.2.1")
 
②可以使用 ImageView 的擴展函數(shù) load 加載一張圖片:
- // URL
 - imageView.load("https://www.example.com/image.jpg")
 - // Resource
 - imageView.load(R.drawable.image)
 - // File
 - imageView.load(File("/path/to/image.jpg"))
 
可以使用 lambda 語法輕松配置請求選項:
- imageView.load("https://www.example.com/image.jpg") {
 - crossfade(true)
 - placeholder(R.drawable.image)
 - transformations(CircleCropTransformation())
 - }
 
error
- imageView.load(url) {
 - error(R.drawable.error)
 - }
 
placeholder預(yù)置展位圖
- imageView.load(url) {
 - placeholder(R.drawable.placeholder)
 - crossfade(3000)
 - }
 
crossfade的動畫時間
- imageView.load(url) {
 - crossfade(3000)
 - }
 
③transformations
Coil默認(rèn)提供了四種變換:模糊變換(BlurTransformation)、圓形變換(CircleCropTransformation)、灰度變換(GrayscaleTransformation)和圓角變換(RoundedCornersTransformation)
基礎(chǔ)用法:
- imageView.load(IMAGE_URL){
 - transformations(GrayscaleTransformation())
 - }
 
直接加入變換就可以, 同時可支持多種變換:
- imageView.load(IMAGE_URL) {
 - transformations(GrayscaleTransformation(),
 - RoundedCornersTransformation(topLeft = 2f, topRight =
 - 2f,bottomLeft = 40f, bottomRight = 40f))
 - }
 
④Gif加載
Coil基礎(chǔ)包中是不支持Gif加載的,需要添加extend包:
- implementation("io.coil-kt:coil-gif:0.9.5")
 
此時需要更改一下代碼的方式,在imageLoader中注冊Gif組件:
- val gifImageLoader = ImageLoader(this) {
 - componentRegistry {
 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
 - add(ImageDecoderDecoder())
 - } else {
 - add(GifDecoder())
 - }
 - }
 - }
 
使用本組件之后,ImageView可直接使用:
- id_image_gif.load(GIF_IMAGE_URL, gifImageLoader)
 
⑤SVG加載
Coil也可以進行SVG加載的,同gif一樣,也是需要添加extend包的:
- implementation("io.coil-kt:coil-svg:0.9.5")
 
代碼如下:
- val svgImageLoader = ImageLoader(this){
 - componentRegistry {
 - add(SvgDecoder(this@MainActivity))
 - }
 - }
 - id_image_svg.load(R.drawable.ic_directions_bus_black_24dp, svgImageLoader)
 
總結(jié)
Coil可以配合Kotlin協(xié)程實現(xiàn)圖片加載:
- 加載性能好:緩存管理(MemCache、DiskCache)、動態(tài)采樣(Dynamic image sampling)、加載中暫停/終止等功能有助于提高圖片加載效率
 - 體積小:其包體積與Picasso相當(dāng),顯著低于Glide和Fresco,僅僅只有1500個方法,但是在功能上卻不輸于其他同類庫;
 - 簡單易用:配合Kotlin擴展方法等語法優(yōu)勢,API簡單易用;
 - 技術(shù)先進:基于Coroutine、OkHttp、Okio、AndroidX等先端技術(shù)開發(fā),確保了技術(shù)上的先進性;
 















 
 
 





 
 
 
 