๐ก์์ฃผ ์ฌ์ฉํ๋ ์ด๋ฏธ์ง ๋ก๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Glide์ ๋ํ์ฌ ํ์ต ๋ด์ฉ์ ๊ธฐ๋กํ์์ต๋๋ค.
Glide
- Glide๋ ์๋๋ก์ด๋์์ ์ด๋ฏธ์ง ๋ก๋ฉ ๋ฐ ์บ์ฑ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋คํธ์ํฌ ๋๋ ๋ก์ปฌ์์ ์ด๋ฏธ์ง๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ ๋ก๋ํ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ, ๋์คํฌ ์บ์, ์ ๋๋ฉ์ด์ ์ง์ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ํฐ ์ด๋ฏธ์ง ํ์ผ์ด๋ ๋น๋๊ธฐ ์ด๋ฏธ์ง ๋ก๋๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
https://github.com/bumptech/glide
Gradle
- Glide๋ฅผ ํ๋ก์ ํธ์ ์ถ๊ฐํ๋ ค๋ฉด build.gradle ํ์ผ์ ์์กด์ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
dependencies {
implementation 'com.github.bumptech.glide:glide:4.15.1' // ์ต์ ๋ฒ์ ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
kapt 'com.github.bumptech.glide:compiler:4.15.1' // Annotation Processor (Optional)
}
์ด๋ฏธ์ง ๋ก๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์ด์
- ๋ก์ปฌ์ ์๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๊ฐ๋จํ์ง๋ง, ๋คํธ์ํฌ๋ ์บ์์์ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ ๋ถ์์ ํ๊ณ ์์์น ๋ชปํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ ์ฅ์์ ์ดํดํ ์ ์๋ ๊ณผ์ ๊ณผ ์ฒ๋ฆฌ๊ฐ ์งํ๋์ด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํด์ค ์ ์๋ ๊ฒ์ด ์ด๋ฏธ์ง ๋ก๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- ์ฌ์ฉ์์๊ฒ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค ๋ ์๋์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
- ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ : ์ด๋ฏธ์ง๋ฅผ ๋ก๋ฉํ๊ธฐ ์ ์ ์ฌ๋ค์ผ์ด๋ ์งํ ์ํฉ ํ์
- ์ด๋ฏธ์ง ๋ก๋ฉ : ์บ์๋ ๋คํธ์ํฌ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ด
- ์ด๋ฏธ์ง ๋์ฝ๋ฉ : BitmapFactory๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋นํธ๋งต ํ์์ผ๋ก ๋ณํํ๊ณ ํฌ๊ธฐ, ํ์ , ํ์ง ๋ฑ์ ๋ณํํ๋ ๋จ๊ณ
- ์ด๋ฏธ์ง ํ์ฒ๋ฆฌ : ๋ณด์ฌ ์ค ์ด๋ฏธ์ง์ ์ ๋๋ฉ์ด์ ์ด๋ ๋ชจ์๋ฆฌ๋ฅผ ๋ฅ๊ธ๊ฒ ํ๋ ๋ฑ์ ํจ๊ณผ๋ฅผ ์ ์ฉ
- ๋ณด์ฌ ์ฃผ๊ธฐ : UI ์ค๋ ๋์์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฉํ๋ ๋จ๊ณ
Glide ์ ์ฉ
- ์ผ๋ฐ์ ์ผ๋ก ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉฐ, ๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค.
- placeholder()์ error()๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๋ก๋์ ์คํจํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
import com.bumptech.glide.Glide
Glide.with(context)
.load("<https://example.com/image.jpg>") // ์ด๋ฏธ์ง URL ๋๋ ํ์ผ ๊ฒฝ๋ก
.into(imageView) // ์ด๋ฏธ์ง๊ฐ ๋ก๋๋ ImageView
.placeholder(R.drawable.placeholder) // ๋ก๋ฉ ์ค ๋ณด์ฌ์ค ์ด๋ฏธ์ง
.error(R.drawable.error_image) // ๋ก๋ฉ ์คํจ ์ ๋ณด์ฌ์ค ์ด๋ฏธ์ง
๋น๋์ค ๋ก๋
- ๋น๋์ค ํ์ผ๊ณผ ์ธ๋ค์ผ์ Glide๋ก ๋ก๋ํ ์๋ ์์ต๋๋ค.
Glide.with(context)
.asBitmap() // ๋น๋์ค ์ธ๋ค์ผ์ Bitmap์ผ๋ก ๋ก๋
.load(Uri.fromFile(File("/path/to/video.mp4"))) // ๋น๋์ค ํ์ผ ๊ฒฝ๋ก
.into(imageView)
RequestOptions ํ์ฉ
- RequestOptions ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ์ด๋ฏธ์ง ๋ก๋ ์ต์ ์ ๋ณด๋ค ์ธ๋ฐํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
val requestOptions = RequestOptions()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error_image)
.override(100, 100) // ์ด๋ฏธ์ง ํฌ๊ธฐ ์กฐ์
Glide.with(context)
.load("<https://example.com/image.jpg>")
.apply(requestOptions) // ์ต์
์ ์ฉ
.into(imageView)
์บ์ ์ ๋ต
- ๋ฉ๋ชจ๋ฆฌ ์บ์์ ๋์คํฌ ์บ์๋ฅผ ์ง์ํ๋ฉฐ, ์ด๋ฅผ ํ์ฉํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋น ๋ฅด๊ฒ ๋ก๋ํ ์ ์์ต๋๋ค.
val requestOptions = RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.ALL) // ๋์คํฌ ์บ์ ์ฌ์ฉ
.skipMemoryCache(true) // ๋ฉ๋ชจ๋ฆฌ ์บ์ ์ฌ์ฉ ์ ํจ
Glide.with(context)
.load("<https://example.com/image.jpg>")
.apply(requestOptions)
.into(imageView)
- DiskCacheStrategy.ALL: ๋ชจ๋ ๋ฒ์ ์ ๋์คํฌ์ ์บ์ํฉ๋๋ค.
- DiskCacheStrategy.NONE: ๋์คํฌ ์บ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
- DiskCacheStrategy.DATA: ๋ก๋๋ ์ด๋ฏธ์ง๋ง ๋์คํฌ์ ์บ์ํฉ๋๋ค.
- DiskCacheStrategy.RESOURCE: ๋ณํ๋ ๋ฆฌ์์ค๋ฅผ ์บ์ํฉ๋๋ค.
Custom Transformation
- Glide์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๋ณํ(์ํ, ์๋ฅด๊ธฐ ๋ฑ) ์ธ์๋ ์ปค์คํ ํธ๋์คํฌ๋ฉ์ด์ ์ ๊ตฌํํ์ฌ ์ ๋์ ์ธ ๋ทฐ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
class GrayscaleTransformation : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("grayscale".toByteArray())
}
override fun transform(
pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int
): Bitmap {
return toGrayscale(toTransform)
}
private fun toGrayscale(src: Bitmap): Bitmap {
val width = src.width
val height = src.height
val bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bmpGrayscale)
val paint = Paint()
val colorMatrix = ColorMatrix()
colorMatrix.setSaturation(0f)
val filter = ColorMatrixColorFilter(colorMatrix)
paint.colorFilter = filter
canvas.drawBitmap(src, 0f, 0f, paint)
return bmpGrayscale
}
}
// ์ฌ์ฉ ์์
Glide.with(context)
.load("<https://example.com/image.jpg>")
.transform(GrayscaleTransformation()) // ๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ ์ ์ฉ
.into(imageView)
Glide ์ฅ์
- ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋์คํฌ ์บ์ ์ต์ ํ
- ์ฌ์ฉํ๊ธฐ ์ฌ์ด API
- GIF ๋ฐ ์ ๋๋ฉ์ด์
์ด๋ฏธ์ง ์ง์
- GIF์ ๊ฐ์ ์ ๋๋ฉ์ด์ ์ด๋ฏธ์ง๋ ์ฝ๊ฒ ๋ก๋ ๋ฐ ์ฌ์ํ ์ ์์ต๋๋ค.
- ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ
- Activity or Fragment์ ์ฐ๊ฒฐ๋์ด ์๋ช ์ฃผ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
Glide vs Picasso
- Picasso๋ Square์ฌ์์ ์ ๊ณตํ๋ ์ด๋ฏธ์ง ๋ก๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค.
- Picasso๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ ์ฒด ํฌ๊ธฐ ์ด๋ฏธ์ง๋ฅผ ์บ์์ ์ ์ฅํฉ๋๋ค.
- ๋์ผํ ์ด๋ฏธ์ง๋ฅผ ์์ฒญํ ๋๋ง๋ค ์ ์ฒด ํฌ๊ธฐ ์ด๋ฏธ์ง๋ฅผ ๋ฐํํ๊ณ ์ค์๊ฐ์ผ๋ก ์ด๋ฏธ์ง ๋ณด๊ธฐ์ ๋ง๊ฒ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค.
- Glide๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ View์ ํฌ๊ธฐ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ํ ์บ์์ ์ ์ฅํฉ๋๋ค.
- ๋ ๊ฐ์ ๋ค๋ฅธ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๊ฐ ํ์ํ ๊ฒฝ์ฐ, ๋์ผํ ์ด๋ฏธ์ง๋ก ๋ ๊ฐ์ง ํด์๋๋ก ์บ์์ ์ ์ฅํ ์ ์์ต๋๋ค.
- Glide๋ Picasso์ ๋นํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ์ง๋ง ๋ก๋ฉ์ด ๋๋ฆฌ๋ค๋ ํน์ง์ด ์์ต๋๋ค.