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