์๋๋ก์ด๋์์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฌ๊ฐํ์ผ๋ก ์๋ฅด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๊ตฌ๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๋ฒ ๊ทธ๋ฆฌ๊ณ ์ํ ์ด๋ฏธ์ง 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๋ฅผ ๊ณง์ฅ ์ง์ ํ๋ค.
์๋๊ฑฐ๋ ๊ถ๊ธํ๊ฑด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์๐ฆ