Android [Kotlin] ๐Ÿ’ป๐Ÿค

[Kotlin] ๊ฐค๋Ÿฌ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€ ๋ฐ›์•„์„œ 1:1 ๋น„์œจ ์›ํ˜•์œผ๋กœ ๋„์šฐ๊ธฐ

๋ฎค๋ง์ด 2022. 6. 12. 01:18

 

์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๊ฐค๋Ÿฌ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๊ฐค๋Ÿฌ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ธฐ๋Šฅ - ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๊ฐค๋Ÿฌ๋ฆฌ ์•ฑ ๋„์šฐ๊ธฐ - ๊ฐค๋Ÿฌ๋ฆฌ ์•ฑ์—์„œ ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์™€์„œ ํ™”๋ฉด์— ๋„์šฐ๊ธฐ 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)