본문 바로가기
Android

[Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 정리 8 - 터치와 키 이벤트

by 들풀민들레 2022. 2. 28.
본 글은 [Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린 - 이지스퍼블리싱 (2022)] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책 혹은 인강을 통해 확인해 주세요.

 

 

터치 이벤트


앱의 화면에서 발생하는 사용자 이벤트는 터치touch입니다. 터치란 손가락으로 화면을 잠시 눌렀다가 떼는 행위를 말합니다. 앱은 사용자의 터치를 인식하고 화면을 손가락으로 눌렀는지 떼었는지 스와이프swipe했는지에 따라 알맞게 동작하도록 구현합니다.
이처럼 앱의 화면에서 발생하는 사용자의 터치 이벤트를 처리하고 싶다면 액티비티 클래스에 터치 이벤트의 콜백 함수인 onTouchEvent()를 선언하면 됩니다. 콜백 함수란 어떤 이벤트가 발생하거나 시점에 도달했을 때 시스템에서 자동으로 호출하는 함수를 말합니다.

 

class MainActivity : AppCompatActivity() {
    (... 생략 ...)
    override fun onTouchEvent(event: MotionEvent?): Boolean {
   	 	return super.onTouchEvent(event)
    }
}

액티비티에 onTouchEvent() 함수를 재정의override해서 선언만 해놓으면 사용자가 이 액티비티 화면을 터치하는 순간 onTouchEvent() 함수가 자동으로 호출됩니다. onTouchEvent() 함수에 전달되는 매개변수는 MotionEvent 객체이며, 이 객체에 터치의 종류와 발생 지점(좌푯값)이 담깁니다.


터치 이벤트의 종류


터치 이벤트는 다음 3가지로 구분됩니다.
• ACTION_DOWN: 화면을 손가락으로 누른 순간의 이벤트
• ACTION_UP: 화면에서 손가락을 떼는 순간의 이벤트
• ACTION_MOVE: 화면을 손가락으로 누른 채로 이동하는 순간의 이벤트

 

만약 화면을 손가락으로 살짝 눌렀다가 떼었다면 onTouchEvent() 함수는 2번 호출됩니다. 첫 번째는 ACTION_DOWN 이벤트가, 두 번째는 ACTION_UP 이벤트가 호출됩니다. 만약 화면을 터치해서 손가락을 이동한 후 떼었다면 처음에 ACTION_DOWN 이벤트가 발생하고 이동하면서 ACTION_MOVE 이벤트가 계속 발생하다가 손가락을 떼는 순간 ACTION_UP 이벤트가 발생합니다.

 

override fun onTouchEvent(event: MotionEvent?): Boolean {
    when (event?.action) {
        MotionEvent.ACTION_DOWN -> {
        	Log.d(“kkang”, “Touch down event”)
        }
        MotionEvent.ACTION_UP -> {
        	Log.d(“kkang”, “Touch up event”)
        }
    }
    return super.onTouchEvent(event)
}

터치 이벤트 발생 좌표 얻기


터치 이벤트를 처리할 때에는 이벤트의 종류뿐만 아니라 이벤트가 발생한 지점을 알아야 하는 경우도 있습니다. 이 좌표도 onTouchEvent() 함수의 매개변수인 MotionEvent 객체로 얻습니다.


• x: 이벤트가 발생한 뷰의 X 좌표
• y: 이벤트가 발생한 뷰의 Y 좌표
• rawX: 화면의 X 좌표
• rawY: 화면의 Y 좌표

 

override fun onTouchEvent(event: MotionEvent?): Boolean {
    when (event?.action) {
        MotionEvent.ACTION_DOWN -> {
        Log.d(“kkang”,
       		 “Touch down event x: ${event.x}, rawX: ${event.rawX}”)
        }
    }
    return super.onTouchEvent(event)
}

x와 rawX 모두 좌푯값이지만 의미하는 바는 다릅니다. x는 터치 이벤트가 발생한 뷰에서의 좌푯값이며 rawX는 스크린, 즉 화면에서의 좌푯값입니다.
따라서 액티비티에 onTouchEvet() 함수를 재정의해서 작성했다면 x와 rawX의 값은 차이가 없습니다. 그런데 터치 이벤트는 특정 뷰에서도 처리할 수 있으므로 onTouchEvent() 함수를 어떤 뷰에 재정의했다면 x와 rawX의 값은 차이가 있습니다.