Coil은 Coroutine Image Loader의 약자이며 Kotlin Coroutines(코루틴)으로 만들어진 가벼운 Android 백앤드 이미지 로딩 라이브러리입니다.
코루틴자체가 내장이 되어 있어 코루틴 라이브러리를 별도로 설치하지 않아도 되는 장점이 있습니다.
장점
- Glide, Fresco보다 상대적으로 가볍다.
- 코루틴이 기본이지만 메인까지는 아니며 심플함과 최소한의 보일러 플레이트(boilerplate)를 위하여 Kotlin의 기능을 활용하여 Kotlin을 잘 다룬다면 사용하기가 매우 쉽다.
- 메모리와 디스크의 캐싱, 메모리의 이미지 다운 샘플링, Bitmap 재사용, 일시정지/취소의 자동화 등등 수 많은 최적화 작업을 수행하므로 처리 속도가 굉장히 빠릅니다.
- 다이나믹 이미지 샘플링을 지원하며 이는 Coil에서 자동으로 알아서 처리됩니다.
- Coil의 이미지 파이프라인(PipeLine)은 크게 세 가지로 구성됩니다.
Mappers, Fetchers, Decoders 이러한 인터페이스를 사용하여 기본 이미지 로딩 기능을 강화하거나 재정의하고 Coil에 새로운 파일 형식에 대한 지원을 추가할 수 있습니다. - Kotlin으로 개발 되었으며 Coroutines, OkHttp, Okio, AndroidX Lifecycles등의 최신 라이브러리를 사용합니다.
단점
- 버전이 아직 정식버전이라고는 할 수 없어서 신뢰성이 낮아 실무에서 사용하는 기업이 많이 없다.
- 최소 Android SDK 버전 14부터 지원을 하나 최신버전에서 사용을 하는 것을 권장함.(AndroidX)
- Kotlin을 모른다면 사용하기 어렵다.
- 일부 기능 사용을 위해 Coroutines이 무엇인지 개념적으로 어느정도 알아야 한다.
프로젝트에 적용하기
1. 먼저 gradle에 Coil을 추가합니다.
: implementation("io.coil-kt:coil:0.10.0")
2. ImageView로 이미지를 로딩하기 위해, Coil의 load 메서드를 사용합니다.
// 각 방식은 아래와 같습니다.
// URL
imageView.load("https://www.example.com/image.jpg")
// Resource
imageView.load(R.drawable.image)
// File
imageView.load(File("/path/to/image.jpg"))
3. 추가로 이미지 핸들링을 하려면 trailing lambda 식을 이용하여 아래와 같이 추가 설정을 할 수 있습니다.
// CircleCrop(이미지 원형으로 자르기) 예시
imageView.load("https://www.example.com/image.jpg") {
crossfade(true)
placeholder(R.drawable.image)
transformations(CircleCropTransformation())
}
4가지의 Image Transformations을 제공합니다.
- BlurTransformation
이미지를 흐릿하게 보이기하는 가우시안 블러(Gaussian Blur)를 적용합니다. - CircleCropTransformation
이미지의 중심을 기준으로 원형으로 이미지를 자릅니다. (예. 카카톡의 원형 프로필 이미지) - GrayscaleTransformation
그레이스케일로 음영처리를 적용합니다. - RoundedCornersTransformation
사이즈에 맞도록 이미지를 자르고 이미지 모서리를 둥글게 라운드를 적용합니다.
이미지 로더 라이브러리 메모리 사용량 비교(Glide vs Picasso vs Coil)
https://jizard.tistory.com/224
Picasso와 Glide 비교분석
https://gun0912.tistory.com/19
참조 :
https://jizard.tistory.com/224
https://gun0912.tistory.com/19
'안드로이드' 카테고리의 다른 글
Android Clean Architecture란? (0) | 2021.05.27 |
---|---|
SAF(Storage Access Framework) (0) | 2021.05.25 |
Storage Scope (0) | 2021.05.14 |
ViewBinding (0) | 2021.05.13 |
Kotlin apply, with, let, also, run 사용? (0) | 2021.05.11 |