[Kotlin] ๊ฐค๋ฌ๋ฆฌ์์ ์ด๋ฏธ์ง ๋ฐ์์ 1:1 ๋น์จ ์ํ์ผ๋ก ๋์ฐ๊ธฐ
์ฝํ๋ฆฐ์ผ๋ก ๊ฐค๋ฌ๋ฆฌ์์ ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ
์ฝํ๋ฆฐ์ผ๋ก ๊ฐค๋ฌ๋ฆฌ์์ ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ ๊ธฐ๋ฅ - ๋ฒํผ ๋๋ฅด๋ฉด ๊ฐค๋ฌ๋ฆฌ ์ฑ ๋์ฐ๊ธฐ - ๊ฐค๋ฌ๋ฆฌ ์ฑ์์ ์ด๋ฏธ์ง ๋ถ๋ฌ์์ ํ๋ฉด์ ๋์ฐ๊ธฐ lqyout์ imageView์ button์ ์ถ๊ฐํ์๋ค. button์ ๋ฆฌ์ค๋ ์ถ๊ฐํ๊ณ int
taekwang.tistory.com
์ด๊ฑธ๋ก ์ด๋ฏธ์ง ๊ฐ์ ธ์๋๋ฐ ์ด๋๋ก ํ๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๊ฐค๋ฌ๋ฆฌ์์ ์ ํํ ์ฌ์ง์ Uri๋ฅผ ์ด์ฉํด ImageView์ ์ ๋ก๋ฉ ์ํค๋ ์์ค
Glide.with(this).load(Uri).into(์ด๋ฏธ์ง๋ทฐ);
"Uri" ๋ถ๋ถ์ ํ์ํ Uri ๋ณ์๋ฅผ ๋ฃ๊ณ "์ด๋ฏธ์ง๋ทฐ" ๋ถ๋ถ์ ์ด๋ฏธ์ง๋ทฐ id๊ฐ์ ๋ฃ์ผ๋ฉด ์ ์ฉ๋๋ค.
Android) ImageView ์ฌ์ง์ด ์๋์ผ๋ก ํ์ ๋ ๋ ํด๊ฒฐ๋ฒ - Glide ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ
์๋๋ก์ด๋ ImageView ์ฌ์ง์ด ์๋์ผ๋ก ํ์ ๋ ๋ ํด๊ฒฐ๋ฒ Exif ๋ฉํ์ ๋ณด ์ด์ฉํ๊ธฐ ๋ณด๋จ Glide ์ด๋ฏธ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํด๋ณด์ ํ์ฌ ๊ฐ๋ฐ์ค์ธ ์๋๋ก์ด๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ํน์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค ํ
h-glacier.tistory.com
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, currentImageUrl)
binding.ivMypageProfile.setImageBitmap(bitmap)
์ด ๋ถ๋ถ์ glide๋ก ๋ณ๊ฒฝํด์คฌ๋ค.
์ด์ ๋ 1:1 ๋น์จ๋ก ๋ฐ์์์ผํ๋ค.
android:scaleType="centerCrop"
centerCrop์ผ๋ก ์ค์ ํด์ฃผ๋ฉด 1:1 ๋น์จ๋ก ์ค์ ๋๋ค.
์๋๋ก์ด๋ ์ด๋ฏธ์ง๋ทฐ ์์ญ์ ๋ง๊ฒ ์ด๋ฏธ์ง๋ฅผ ํ๋ ๋๋ ์ถ์ํ๋ ๋ฐฉ๋ฒ. [scaleType] (How to Scale the Imag
1. ImageView์ ์์ญ๊ณผ ์ด๋ฏธ์ง์ ํฌ๊ธฐ. ์ง๋ ๊ธ [๊ฐ๋ฐ์ ๋ ์ํผ - ์๋๋ก์ด๋ ์ด๋ฏธ์ง๋ทฐ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ]์์, ์ด๋ฏธ์ง ํ์ผ(png, jpg)์ ์ ์ฅ๋ ์ด๋ฏธ์ง๋ฅผ ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด ImageView๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
recipes4dev.tistory.com
์ํ์ผ๋ก ๋ฐ์์ค๋ ๊ฒ์ ๊ฐ๋จํ .circleCrop() ์ฝ๋ ํ๋๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
Glide.with(this).load(currentImageUrl).circleCrop().into(binding.ivMypageProfile)
์๋๋ก์ด๋ Glide์ CircleImageView๋ก ์ํ ์ด๋ฏธ์ง ํ์
์๋๋ก์ด๋ ์์ ์ ํ๋ ์ค ์ด๋ฏธ์ง๋ทฐ๋ฅผ ๋๊ทธ๋๊ฒ ํ์ํด์ผ ํ๋ ์ํฉ์ ๋ง๋ฌ๋ค. ์นด์นด์คํก์ ํ๋กํ ์ฌ์ง์ด ๋๊ทธ๋๊ฒ ํ์๋๋ ๊ฒ๊ณผ ์ ์ฌํ ํํ์ ์์ ์ด์๋ค. ๋น์ฐํ ์๋๋ก์ด๋์ ๊ธฐ๋ณธ UI๋ฅผ
calvinjmkim.tistory.com
์ต์ข ์ฝ๋
private val OPEN_GALLERY = 1
private fun openGallery() {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.setType("image/*")
startActivityForResult(intent, OPEN_GALLERY)
}
@Override
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
if (requestCode == OPEN_GALLERY) {
var currentImageUrl: Uri? = data?.data
try {
Glide.with(this).load(currentImageUrl).circleCrop().into(binding.ivMypageProfile)
} catch (e: Exception) {
e.printStackTrace()
}
}
} else {
}
}
๋ค์์ Glide์ ๋ํด ๊ณต๋ถํ๊ธฐ ์ํด ์๋ ์ฌ์ดํธ๋ค์์ ๊ฐ์ ธ์จ ๊ธ์ด๋ค.
[Android] Glide ๋ก ์ด๋ฏธ์ง Loadํ๊ธฐ
Glide Glide, ๊ธ๋ผ์ด๋๋ ์๋๋ก์ด๋์์ ์ด๋ฏธ์ง๋ฅผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ๋ ๊ฐ๋จํ๊ณ ํ์ฅ์ฑ๋ ๋์ด์ ์ด๋ฏธ ๋ฉ์ด์ ํ๊ฒ ์ฌ์ฉ๋๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ
blog.yena.io
[Android] Glide ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ
Glide๋? ๊ตฌ๊ธ์์ ๊ณต๊ฐํ ์ด๋ฏธ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข์ ์ด๋ฏธ์ง ๋ก๋ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์๋ ค์ ธ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ง ๋ก๋ฉ๊ณผ ๋์์, gif ํ์ผ ๋ก๋ฉ๊น์ง ์ง์ํ๋ค. Gradle ์ถ๊ฐ gradle์ Glide ๋ผ์ด
leveloper.tistory.com
Glide๋ ์๋๋ก์ด๋์์ ์ด๋ฏธ์ง๋ฅผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ๋ ๊ฐ๋จํ๊ณ ํ์ฅ์ฑ๋ ๋์ด์ ์ด๋ฏธ ๋ฉ์ด์ ํ๊ฒ ์ฌ์ฉ๋๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ด๋ฏธ์ง, Gif, ๋น๋์ค ์คํธ์ ๋ก๋ฉ๊ณผ ๋์ฝ๋ฉ, ์บ์ฑ ๋ฑ์ ๋ค์ํ API๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ปค์คํ ํ๊ฒ ๋ง๋ค์ด์ง HttpUrlConnection ๊ธฐ๋ฐ์ด์ง๋ง, Volley๋ OkHttp ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ๋ฌ๊ทธ์ธ๋ ์ง์ํ๋ค.
Glide๋ ์ด๋ ํ ์ข ๋ฅ์ ์ด๋ฏธ์ง์ด๋๋ผ๋ ๋น ๋ฅด๊ณ ๋ถ๋๋ฝ๊ฒ ์คํฌ๋กค ํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค.
๋ทฐ์ ์ด๋ฏธ์ง ๋ก๋ํ๊ธฐ
ํน๋ณํ ์ต์ ์์ด ๋จ์ํ ๋ทฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ๋ ๊ฒ์ด๋ผ๋ฉด with(), load(), into() ๋ก๋ ํํํ ์ ์๋ค.
/* Activity์์ ์ฌ์ฉํ ๊ฒฝ์ฐ */
Glide.with(this)
.load(R.drawable.img_file_name)
.into(imageView)
/* ViewHolder์์ ์ฌ์ฉํ ๊ฒฝ์ฐ */
Glide.with(itemView)
.load(R.drawable.img_file_name)
.into(itemView.imageView)
drawable์ img_file_name.jpeg ํ์ผ์ ๋ฃ๊ณ Glide๋ก ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ์ฌ์ฉํด๋ณด์๋ค. RecyclerView์์ ์ฌ์ฉํ๋ ค๋ฉด ViewHolder์์ ๋ฐ์ธ๋ํ ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ถ๋ฌ์ฃผ๋ฉด ๋๋ค.
๊ฐ ํจ์์ ๊ธฐ๋ฅ์ ๊ฐ๋จํ ์ดํด๋ณด์.
- with() : View, Fragment ํน์ Activity๋ก๋ถํฐ Context๋ฅผ ๊ฐ์ ธ์จ๋ค.
- load() : ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ค. ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค. (Bitmap, Drawable, String, Uri, File, ResourId(Int), ByteArray)
- into() : ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค View๋ฅผ ์ง์ ํ๋ค.
์์ ํจ์๋ค์ Glide์ ๋ผ๋๊ฐ ๋๋ ๊ธฐ๋ฅ์ด๋ค. Glide๋ ๋จ์ํ ๋ก๋ฉ๋ง ๋์์ฃผ๋ ๊ฒ์ด ์๋๋ผ, ์๋ฌ ์ํฉ์ด ๋ฐ์ํ๋ค๋๊ฐ ํ๊ฐ๊ณต์ด ํ์ํ ๋์ ์์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ํจ์๋ฅผ ์ ๊ณตํ๋ค.
์์๋ก, ์ด๋ฏธ์ง ๋ก๋ฉ ์ /ํ ์ฒ๋ฆฌ์ ๋ํ ํจ์๋ฅผ ๋ณด์.
Glide.with(this)
.load(R.drawable.img_file_name)
.placeholder(R.drawable.img_file_place_holder)
.error(R.drawable.img_file_error)
.fallback(R.drawable.img_file_no_img)
.into(imageView)
- placeholder() : Glide ๋ก ์ด๋ฏธ์ง ๋ก๋ฉ์ ์์ํ๊ธฐ ์ ์ ๋ณด์ฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ค์ ํ๋ค.
- error() : ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฌ์ค๋ค๊ฐ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ๋ณด์ฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ค์ ํ๋ค.
- fallback() : loadํ url์ด null์ธ ๊ฒฝ์ฐ ๋ฑ ๋น์ด์์ ๋ ๋ณด์ฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ค์ ํ๋ค.
Glide์ ๋ชจํ ๊ฐ ๋น ๋ฅด๊ณ ๋ถ๋๋ฌ์ด ์คํฌ๋กค์ ์ ๊ณตํ๋ ๊ฒ์ด๋ผ๊ณ ํ ๊ฒ์ ๊ธฐ์ตํ๋ค๋ฉด, ์ ํจ์๊ฐ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค. ํ์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ณด๋ค placeholder๋ no image ํ์ผ์ ๋ณด์ฌ์ค๋ค๋ฉด ์ฌ์ฉ์ ์ ์ฅ์์ ๋ ์ข์ UX๋ฅผ ๊ฒฝํํ ์ ์์ ๊ฒ์ด๋ค.
๋ ๋ค๋ฅธ ์ฅ์ ์ผ๋ก๋, Glide์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ์ง์ URL์ ์ด์ฉํด ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ์ ์บ์ฑ์ ํ๋ค.
Glide.with(this)
.load(R.drawable.img_file_name)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView)
- skipMemoryCache() : ๋ฉ๋ชจ๋ฆฌ์ ์บ์ฑํ์ง ์์ผ๋ ค๋ฉด true๋ก ์ค๋ค.
- diskCacheStrategy() : ๋์คํฌ์ ์บ์ฑํ์ง ์์ผ๋ ค๋ฉด DiskCacheStrategy.NONE๋ก ์ค๋ค. ๋ค์๊ณผ ๊ฐ์ ์ต์ ์ด ์๋ค. (ALL, AUTOMATIC, DATA, NONE, RESOURCE)
์ด๋ก์จ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๊ณผ ์๋ฒ ํต์ ์ ํจ์จ์ ์ผ๋ก ํ ์ ์๊ฒ ํด์ค๋ค.
1. override()
override ๋ฉ์๋๋ก ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํด์ค ์ ์๋ค. ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํ๋ฉฐ ์ด๋ฏธ์ง ๋ก๋ฉ ์๋๋ฅผ ์ต์ ํํ ์ ์๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ณ ์ถ์ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
Glide.with(this)
.load("์ด๋ฏธ์ง url")
.override(100, 100)
.into(imageView)
2. asGif()
gif ์ด๋ฏธ์ง๋ ๋ก๋ฉํ ์ ์๋ค.
Glide.with(this)
.asGif()
.load("gif ์ด๋ฏธ์ง url")
.into(imageView)
3. thumbnail()
์๋ณธ ์ด๋ฏธ์ง๋ฅผ ์ธ๋ค์ผ๋ก ์ฌ์ฉํ๋ค. ์ง์ ํ % ๋น์จ๋งํผ ๋ฏธ๋ฆฌ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ ๋ณด์ฌ์ค๋ค. 0.1f๋ก ์ง์ ํ๋ค๋ฉด ์ค์ ์ด๋ฏธ์ง ํฌ๊ธฐ ์ค 10%๋ง ๋จผ์ ๊ฐ์ ธ์์ ํ๋ฆฟํ๊ฒ ๋ณด์ฌ์ค๋ค.
Glide.with(this)
.load("์ด๋ฏธ์ง url")
.thumbnail(0.1f)
.into(imageView)