[AndroidStudio] Line&Circle Draw

han91·2024년 5월 7일

[AndroidStudio]

목록 보기
8/15

사용자가 클릭한 지점을 시작점으로 직선을 그리거나 원을 그리는 어플
-> menu 사용

MainActivity.kt

class MainActivity : AppCompatActivity() {

    val setLine : Int = 1
    val setCircle : Int = 2
    var curShape : Int = setLine

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 화면에 결과 그리기
        setContentView(MyGraphicView(this))
    }
    // actionBar에 메뉴 띄우기
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        super.onCreateOptionsMenu(menu)
        val inflater : MenuInflater = menuInflater
        // 직접 만든 custom menu 사용
        inflater.inflate(R.menu.graph_menu, menu)
        return true
    }
    // 메뉴에서 항목이 선택 되었을 때
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            R.id.addLine -> {
                curShape = setLine
                // Boolean type이라서 return true 사용
                return true
            }
            R.id.addCircle -> {
                curShape = setCircle
                return true
            }
            else -> {
                return super.onOptionsItemSelected(item)
            }
        }
    }
    // 실제로 그림을 그리는 class
    inner class MyGraphicView(context: Context) : View(context) {
        private var startX : Float = -1f
        private var startY : Float = -1f
        private var stopX : Float = -1f
        private var stopY : Float = -1f
        // 클릭 했을 때
        override fun onTouchEvent(event: MotionEvent?): Boolean {
            when(event?.action) {
                // 클릭(화면을 터치)한 상태
                MotionEvent.ACTION_DOWN -> {
                    startX = event.getX()
                    startY = event.getY()
                }
                // 클릭을 해제(화면에서 손을 뗀 상태)
                MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP -> {
                    stopX = event.getX()
                    stopY = event.getY()
                    // 그림이 그려짐
                    this.invalidate()
                }
            }
            return true
        }
        // inner class 안에 선언 -> canvas에 직접 그림을 그림
        override fun onDraw(canvas: Canvas?) {
            super.onDraw(canvas)
            val paint = Paint()
            // 확대시 안 깨지게 만들어주기
            paint.isAntiAlias = true
            
            paint.style = Paint.Style.STROKE
            paint.strokeWidth = 5f
            paint.color = Color.RED
            // 선택된 항목이 선 or 원일 때
            when(curShape) {
                setLine -> canvas?.drawLine(startX, startY, stopX, stopY, paint)    // 선 그리기
                setCircle -> {
                    // 반지름을 구하기 위함
                    val a = (stopX - startX).pow(2)
                    val b = (stopY - startY).pow(2)
                    // 반지름 선언
                    val radius = sqrt(a + b)
                    // 원 그리기
                    canvas?.drawCircle(startX, startY, radius, paint)
                }
            }
        }
    }
}
profile
천방지축어리둥절빙글빙글돌아가는개발자

0개의 댓글