๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
studies/Mobile Application

[Kotlin/Android] Fragment Activity์—์„œ Image Cropper์™€ CircleImageView ์‚ฌ์šฉํ•˜๊ธฐ

by Vada Kim 2021. 6. 16.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ž๋ฅด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„๊ตฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ• ๊ทธ๋ฆฌ๊ณ  ์›ํ˜• ์ด๋ฏธ์ง€ XML์ปดํผ๋„ŒํŠธ์— ๋ถˆ๋Ÿฌ์˜จ ์ด๋ฏธ์ง€๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

How to use ImageCropper and CircleImageView in android with kotlin.

 

 

 

0. ์‚ฌ์šฉ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ๊ฐœ

https://github.com/ArthurHub/Android-Image-Cropper

 

ArthurHub/Android-Image-Cropper

Image Cropping Library for Android, optimized for Camera / Gallery. - ArthurHub/Android-Image-Cropper

github.com

https://github.com/hdodenhof/CircleImageView

 

hdodenhof/CircleImageView

A circular ImageView for Android. Contribute to hdodenhof/CircleImageView development by creating an account on GitHub.

github.com

https://github.com/square/picasso

 

square/picasso

A powerful image downloading and caching library for Android - square/picasso

github.com

 

 

 

 

 

 

1. build.gradle:app์— dependencies ์ถ”๊ฐ€

implementation 'de.hdodenhof:circleimageview:3.1.0' //์›ํ˜• ์ด๋ฏธ์ง€ XML ์ปดํผ๋„ŒํŠธ
implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.+' //์ด๋ฏธ์ง€ ์ž๋ฅด๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
implementation 'com.squareup.picasso:picasso:2.71828' //์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์บ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

 

 

 

 

2. Fragment XML์— CircleImageView ์ƒ์„ฑ

์•„๋ž˜๋Š” ์˜ˆ์‹œ ๋””์ž์ธ์ด๋‹ค. ์ด๋ฏธ์ง€ ๋ทฐ์™€ ๊ทธ ์šฐ์ธกํ•˜๋‹จ์˜ ๋ฒ„ํŠผ๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ''ํ”„๋ž˜๊ทธ๋จผํŠธ''๊ฐ€ ๋  XML๋ทฐ์ด๋‹ค.

์›ํ˜• ์ด๋ฏธ์ง€ ๋ทฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ปดํผ๋„ŒํŠธ์™€ ImageCropper๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฒ„ํŠผ์„ ์ •์˜ํ•œ๋‹ค. ์•„์ด๋”” ์™ธ ์†์„ฑ์€ ์ง์ ‘ ๋งŒ๋“ค์–ด์ฃผ๊ธธ ๋ฐ”๋ž€๋‹ค. ์ด ๊ธ€์„ ์ฐธ๊ณ ํ• ๋• ์•„๋ž˜์˜ ์ปดํผ๋„ŒํŠธ Id๊ฐ’์„ ์ฃผ์‹œํ•˜๋ฉฐ ํ๋ฆ„์— ๋”ฐ๋ผ๊ฐ€๊ธธ! 

 

fragment_image_set.xml

<de.hdodenhof.circleimageview.CircleImageView
  android:id="@+id/init_profileimg_view"/>
  
<com.google.android.material.floatingactionbutton.FloatingActionButton
  android:id="@+id/init_profileimg_reset_btn"/>

 

 

 

3. ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์ข…์†๋  ๋ถ€๋ชจXML์˜ Activity ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ ์ž‘์„ฑ 

//import ์ƒ๋žต

class ProfileInitActivity : AppCompatActivity() {
    companion object{
        lateinit var ProfileInitContext: Context
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(/*์ƒ๋žต*/)
        /*ํ˜„์žฌ ์‹ค์Šต์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ์ตœ์†Œํ•œ์œผ๋กœ ์ž‘์„ฑํ–ˆ์œผ๋‹ˆ 
        ํ”„๋ž˜๊ทธ๋จผํŠธ ์ง€์ •๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„์€ ์ง์ ‘ ์ž‘์„ฑํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค*/
        ProfileInitContext = this
    }
    
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK && data != null){
            var result = CropImage.getActivityResult(data) //result.uri
            profileImageView.setImageURI(result.uri) //XML์˜ ์ด๋ฏธ์ง€๋ทฐ ์ปดํผ๋„ŒํŠธ์— ์ด๋ฏธ์ง€ ์ง€์ •
            //profileImageView ๋ณ€์ˆ˜๋Š” fragment์˜ Activity.ktํŒŒ์ผ์— ์„ ์–ธ๋  ์ „์—ญ๋ณ€์ˆ˜
        }
    }
}

 

 

 

 

 

4. Fragment์˜ Activity kotlin ํŒŒ์ผ ์ž‘์„ฑ

//import ์ƒ๋žต

class FragInitImage: Fragment() {

    companion object{ //์ „์—ญ๋ณ€์ˆ˜
        lateinit var profileImageView: CircleImageView //๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด๋ฏธ์ง€ ๋ทฐ ์ปดํผ๋„ŒํŠธ!!
        lateinit var resetImageButton: FloatingActionButton
    }
    lateinit var nicknameView: TextView

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_image_set, container, false) //setContentPane

        profileImageView = view.findViewById(R.id.init_profileimg_view) //CircleImageView
        resetImageButton = view.findViewById(R.id.init_profileimg_reset_btn) //์ด๋ฏธ์ง€ ๋ฆฌ์…‹ ๋ฒ„ํŠผ

        resetImageButton.setOnClickListener{
        	//๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ด๋ฏธ์ง€ ์ž๋ฅด๊ธฐ์šฉ ์•กํ‹ฐ๋น„ํ‹ฐ ํ˜ธ์ถœ
            CropImage.activity().setAspectRatio(1, 1).start(ProfileInitContext as Activity)
            //์ด๋•Œ ProfileInitContext๋Š” ์œ„์— ๋งŒ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์ข…์†๋  ์ผ๋ฐ˜ XMLํŒŒ์ผ์˜ Context๋ฅผ ๋‹ด์€ ์ „์—ญ๋ณ€์ˆ˜
            //์ด๋ฏธ์ง€ ํฌ๋กญ ์™„๋ฃŒ ํ›„ ProfileInitActivity.onAcitivtyResult ์‹คํ–‰
        }

        return view
    }

}

์ด๋•Œ ImageCropper ์ฒ˜๋ฆฌ ํ›„์˜ ์ฝ”๋“œ(onActivityResult)๊ฐ€ FragInitImage.kt๊ฐ€ ์•„๋‹Œ ProfileInitActivity.kt์—์„œ ์ด๋ค„์ง€๋Š” ์ด์œ ๋Š”, AppCompatActivity ํ˜•์‹์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Fragment()ํƒ€์ž…์˜ FragInitImage ํด๋ž˜์Šค์—์„œ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์—†์Œ.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ProfileInitActivity.kt์—์„œ Activityํ˜•์‹์„ ๋ฝ‘๊ธฐ ์œ„ํ•ด Context๋ฅผ ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ํ›„, FragInitImage.kt์—์„œ importํ•ด์™€ Activity๋กœ ํ˜•๋ณ€ํ™˜ํ•ด ์‚ฌ์šฉํ–ˆ๋‹ค.

Cropper๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‘๋‹ต๊ฒฐ๊ณผ๋ฅผ onActivityResult๋ฉ”์„œ๋“œ์—์„œ ๋ฐ›์„๋•Œ๋Š” CircleImageView์ปดํผ๋„ŒํŠธ๋ฅผ ๋‹ด์€ ์ „์—ญ๋ณ€์ˆ˜ profileImageView๋ฅผ importํ•ด ๋ถˆ๋Ÿฌ์˜จ ์ด๋ฏธ์ง€Uri๋ฅผ ๊ณง์žฅ ์ง€์ •ํ–ˆ๋‹ค.

 

 

 


 

์•ˆ๋˜๊ฑฐ๋‚˜ ๊ถ๊ธˆํ•œ๊ฑด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”๐Ÿฆ

728x90
๋ฐ˜์‘ํ˜•