본문 바로가기
개발(Development)/Android(안드로이드)

[안드로이드 코틀린] 커스텀 뷰에 터치 이벤트 리스너 등록 방법

by 카레유 2021. 8. 20.

안드로이드에서

코틀린으로 커스텀뷰를 만들고, 이벤트 리스너를 등록하는 방법은 아주 간단하다.

 

단, 이 글은 커스텀뷰의 기초를 안다는 전제하에 작성되었다.

커스텀뷰 사용 방법은 아래 글을 참고하자.

 

[안드로이드 코틀린] View 출력 원리와 커스텀뷰 생성/사용 방법 기초

 

[안드로이드 코틀린] 커스텀 View 전용 속성 정의 및 사용 방법: attr.xml

 

[안드로이드 코틀린] 커스텀 View 화면 갱신 방법(새로 그리기): invalidate()


# 커스텀 뷰에 터치이벤트 리스너 설정 방법

1. 커스텀뷰 클래스 생성

2. onTouchEvent() 메서드 정의

- View 클래스에 정의된 onTouchEvent() 메서드는 뷰에 터치이벤트가 발생할 때마다 콜백된다.

- onTouchEvent() 메서드를 오버라이딩 하여, 필요한 이벤트 처리 코드를 넣어두면 된다.

 

< 전체 코드>

class CustomView: View {

    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        val paint = Paint()
        paint.color = Color.BLUE
        paint.textSize = 40f

        canvas?.drawText("터치이벤트 발생", 100f, 100f, paint)
    }
    
    // 터치 이벤트 처리
    override fun onTouchEvent(event: MotionEvent?): Boolean {

        // Toast 띄우기
        Toast.makeText(context, "터치 이벤트 발생", Toast.LENGTH_SHORT).show()

        return true
    }
}

 

3. 터치이벤트의 종류 및 좌표 취득 방법

- onTouchEvent(event: MotionEvent?) 메서드의 매개변수로 들어오는 MotionEvent객체에는 발생한 터치 이벤트의 종류와  좌표 정보가 저장되어 있다.

 

- 이벤트 종류는 event.action 로 확인할 수 있다.

- 이벤트 좌표는 event.x, event.y 로 취득할 수 있다.

 

* 터치 이벤트 종류는 다음과 같다

-  MotionEvent.ACTION_DOWN
- MotionEvent.ACTION_MOVE
- MotionEvent.ACTION_UP
- MotionEvent.ACTION_CANCEL

 

- 터치 이벤트가 발생할  때마다 이벤트의 종류 및 좌표를 출력하는 예제.

class CustomView : View {

    // 생성자
    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)


    // 터치 이벤트 정보를 담아둘 변수
    var coords: PointF? = null
    var action: String? = ""


    // 뷰 그리기
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        val paint = Paint()
        paint.color = Color.BLUE
        paint.textSize = 40f

        canvas?.drawText("$action ${coords?.x}, ${coords?.x}", 100f, 100f, paint)
    }


    // 터치 이벤트 처리
    override fun onTouchEvent(event: MotionEvent?): Boolean {

        // 1. 터치 좌표 취득
        coords = PointF(event!!.x, event!!.y)

        // 2. 터치 이벤트 종류 취득
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {action = "ACTION_DOWN"}
            MotionEvent.ACTION_MOVE -> {action = "ACTION_MOVE"}
            MotionEvent.ACTION_UP -> {action = "ACTION_UP"}
            MotionEvent.ACTION_CANCEL -> {action = "ACTION_CANCEL"}
        }

        // 3. View 화면 갱신
        invalidate()

        return true
    }
}

 

<실행 결과>

 

댓글