GDSC HUFS 4기/Kotlin Team #7

[7팀] 드로잉 앱 안드로이드 12 part 7

jorippppong_조리퐁 2022. 11. 29. 13:15

 

이 글은 유데미 강의 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
}