본문 바로가기

Android Project

[Android/Kotlin] 드로잉앱(1)

그림을 그릴수있는 간단한 앱을 만들어볼건데 이번에는 화면에 그림이 그려지고 손을 떼면 그림이 사라지는 부분을 만들어볼것이다

 

먼저 Manifest에 들어가서 activity안에 이 코드를 추가해준다

화면을 세로방향으로 고정시켜주는 코드다

android:screenOrientation="portrait"

 

 

그다음에 DrawingView.kt라는 코틀린 class를 만들어서 코드를 작성해준다

 

package com.example.drawingapp

import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View

// view를 사용해서 context, attrs라는 변수생성 (이렇게하면 밑에다가 변수나 메서드 만들수있음 / 히위요소사용,재정의 가능)
class DrawingView(context: Context, attrs : AttributeSet) : View(context, attrs){

    // 변수생성
    private var mDrawPath : CustomPath? = null   //그려질 path
    private var mCanvasBitmap : Bitmap? = null
    private var mDrawPaint : Paint? = null       //geometry,text,bitmap등을 그릴때 사용하는 스타일이나 색상
    private var mCanvasPaint : Paint? = null
    private var mBrushSize : Float = 0.toFloat() //붓 두께(0으로 설정)
    private var color = Color.BLACK              //색상(검정)
    private var canvas : Canvas? = null          //그림그릴수있는 배경


    init {
        setUpDrawing()
    }


    //setUpDrawing 함수생성해서 모든변수를 설정
    private fun  setUpDrawing(){
        mDrawPaint = Paint()
        mDrawPath = CustomPath(color,mBrushSize)   //color,mBrushSize는 null이 아니기 때문에 CustomPath로 바로 전달가능 / 이제 mDrawPath는 null이 아님
        mDrawPaint!!.color = color                 //컬러설정
        mDrawPaint!!.style = Paint.Style.STROKE    //스타일설정
        mDrawPaint!!.strokeJoin = Paint.Join.ROUND //stroke의 시작 설정(둥글게)
        mDrawPaint!!.strokeCap = Paint.Cap.ROUND   //stroke의 끝 설정(둥글게)
        mCanvasPaint = Paint(Paint.DITHER_FLAG)
        mBrushSize = 20.toFloat()
    }

    //화면의 크기가 바뀔때마다 불러오게
    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        mCanvasBitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888)
        canvas = Canvas(mCanvasBitmap!!)

    }

    //그림그릴때 실행
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        canvas.drawBitmap(mCanvasBitmap!!, 0f, 0f, mCanvasPaint)

        if(!mDrawPath!!.isEmpty){
            mDrawPaint!!.strokeWidth = mDrawPath!!.brushThickness   //페인트 두꼐
            mDrawPaint!!.color = mDrawPath!!.color
            canvas.drawPath(mDrawPath!!, mDrawPaint!!)
        }

    }


    //화면터치했을때 실행
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        val touchX = event?.x
        val touchY = event?.y

        when(event?.action){

            //화면 눌렀을때(터치했을때) 실행할 이벤트
            MotionEvent.ACTION_DOWN ->{
                mDrawPath!!.color = color
                mDrawPath!!.brushThickness = mBrushSize //얼마나 두꺼운지

                //가지고있던것을 리셋(그린선을 지움)하고
                mDrawPath!!.reset()
                // touchX,touchY위치로 이동 (touchX,touchY가 null이 아닌경우에만)
                if (touchX != null) {
                    if (touchY != null) {
                        mDrawPath!!.moveTo(touchX, touchY)
                    }
                }
            }

            //화면 드래그 했을때 실행할 이벤트
            MotionEvent.ACTION_MOVE -> {
                if (touchX != null) {
                    if (touchY != null) {
                        mDrawPath!!.lineTo(touchX,touchY)
                    }
                }
            }

            //화면에서 손가락 땠을때 실행할 이벤트
            MotionEvent.ACTION_UP -> {
                mDrawPath = CustomPath(color, mBrushSize)
            }
            else -> return false
        }
        // 전체뷰 무효화
        invalidate()

        return true
    }


    //internal inner를 썼으므로 CustomPath클래스를 DrawingView 내부에서만 사용
    //CustomPath라는 변수고, path타입
    internal inner class CustomPath(var color : Int, var brushThickness : Float) : Path(){



    }


}

DrawingView.kt

 

 

그리고 화면에 방금 쓴 내용이 보여질수있도록 activity_main.xml에 DrawingView를 추가한다

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.drawingapp.DrawingView
        android:id="@+id/drawing_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="MissingClass" />

</androidx.constraintlayout.widget.ConstraintLayout>

 activity_main.xml

 

 

 

 

 

 

지금까지 작성한코드를 실행시켜보면 이렇게 작동한다. 그림을 그릴수있지만 떼면 다시 사라진다

이 다음에는 손을 떼도 그림이 사라지지 않게 만들어볼것이다!

'Android Project' 카테고리의 다른 글

[Android/Kotlin] FLO앱 클론코딩(1)  (0) 2024.01.05
[Android/Kotlin] 퀴즈앱(2)  (0) 2023.12.15
[Android/Kotlin] 퀴즈앱(1)  (0) 2023.12.10
[Android/Kotlin] 계산기앱  (0) 2023.12.10
[Android/Kotlin] 나이 계산앱  (0) 2023.12.10