이 글은 유데미 강의 Android 12 및 Kotlin 개발 완전 정복을 참고하여 작성하였습니다.
작성자 : 조유리
개발환경은 Windows, Android Studio입니다.
1. undo 버튼 만들기
그린 선을 삭제해주는 기능
//DrawingView.kt
fun onClickUndo() {
if (mPaths.size > 0) { //삭제할 path가 있었는지 부터 확인한다.
//0보다 클 때만 mUndoPaths에 뭔가를 추가하도록 설정한다.
mUndoPaths.add(mPaths.removeAt(mPaths.size - 1))
//mPaths에서 삭제하는 path를 추가하는 코드를 한줄로 작성한다.
//arraylist의 마지막 입력값을 인자로 넣는다. (mPath는 arraylist)
//removeAt 삭제된 값을 돌려준다. 지운 아이템을 받아서 mUndoPaths에 추가
invalidate() //내부로 onDraw를 불러온다.
//invalidate : API 설명 "전체 뷰의 무효화"
//현재 뷰에 나타나 있는 모든 그림 및 이미지들을 무효화해서 화면에 나타나지 않게 한다.
}
}
internal inner class CustomPath(var color:Int,var brushThickness:Float):Path()
}
//MainActivity.kt
val ibUndo: ImageButton = findViewById(R.id.ib_undo)
ibUndo.setOnClickListener {
drawingView?.onClickUndo()
}
2. CoRoutine
사용자가 너무 오래 기다리지 않게 하기 위해 코틀린은 5초까지의 대기시간을 준다.
coroutine : 오래 걸리는 작업을 background의 다른 스레드로 넘겨서 다른 스레드로 넘겨서 UI스레드가 차단되지 않고 계속 실행되서 사용자가 막힘없이 앱을 사용하도록 만든다.
- 경량 : 서스펜션의 지원으로 단일 스레드에서 많은 코루틴을 실행할 수 있다.
- 메모리 누수 감소 : 스코프 끝에서 종료될 때 누출이 발생하지 않는다.
- 기본으로 제공되는 취소 지원 : 실행 중인 코루틴 계층 구조를 통해 자동으로 취소가 전달된다.
- jetpack 통합 : 많은 jetpack 라이브러리에 코루틴을 완전히 지원하는 확장 프로그램이 포함되어 있다.
3. 그림 저장 기능 추가
1) path 만들기
//path.xml
<?xml version="1.0" encoding="utf-8"?>
<paths Xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name = "captured"
path = "Android/data/eu.tutorials.kiddrawingapp/files"/>
</paths>
2) manifest 파일에 provider 추가
//Manifest.xml
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="eu.kidsdrawingapp.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/path" />
</provider>
- android:exported
다른 애플리케이션에서 콘텐츠 제공자를 사용할 수 있는지 여부를 지정
true : 모든 애플리케이션이 제공자에 지정된 권한에 따라 제공자의 URI를 사용해 액세스할 수 있다.
false : 콘텐츠 제공자 사용 불가능. 내 애플린케이션만 제공자에 액세스할 수 있게 제한 (default)
- android:grantUriPermissions
일반적으로는 콘텐츠 제공자의 데이터에 액세스할 권한이 없는 사용자에게 액세스 권한을 부여함으로써 readPermission, writePermission, permission, exported 속성에 따른 제한을 일시적으로 극복할 수 있는지 여부입니다. 부여할 수 있으면 'true'이고 부여할 수 없으면 'false'이다.
3) 합치기
: canvas + 뷰 + background
//canvas + 뷰 + background
private fun getBitmapFromView(view: View): Bitmap{
val returnedBitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
//canvas를 뷰와 바인딩 해준다.(사용자가 그린 그림)
val canvas = Canvas(returnedBitmap)
//background를 가져온다.
val bgDrawable = view.background
if (bgDrawable != null) {
//background가 있다면 그것을 지정
bgDrawable.draw(canvas)
} else {
//background가 없다면 흰색으로 지정
canvas.drawColor(Color.WHITE)
}
//캔버스를 뷰 위에 그려야한다.
view.draw(canvas)
//bitmap을 return
return returnedBitmap
}
'GDSC HUFS 4기 > Kotlin Team #7' 카테고리의 다른 글
[7팀] 드로잉 앱 안드로이드 12 part 6 (0) | 2022.11.29 |
---|---|
[7팀] 드로잉 앱 안드로이드 12 part 8 (0) | 2022.11.21 |
[7팀] 드로잉 앱 안드로이드 12 part 3 (0) | 2022.11.16 |
[7팀] 드로잉 앱 안드로이드 12 part 4 (0) | 2022.11.14 |
[7팀] 드로잉 앱 안드로이드 12 part 2 (0) | 2022.11.14 |