앱의 화면에서 발생하는 사용자 이벤트는 터치(touch) 이다.
앱의 화면에서 발생하는 사용자의 터치 이벤트를 처리하고 싶다면 액티비티 클래스에 터치 이벤트의 콜백 함수인 onTouchEvent()를 선언하면 된다.
콜백 함수란, 어떤 이벤트가 발생하거나 시점에 도달했을 때 시스템에서 자동으로 호출하는 함수를 말한다.
- 터치 이벤트 처리
class MainActivity : AppCompatActivity() { (... 생략 ...) override fun onTouchEvent(event : MotionEvent?): Boolean { return super.onTouchEvent(event) } }
액티비티에 onTouchEvent()
함수를 재정의해서 선언만 해놓으면 사용자가 이 액티비티 화면을 터치하는 순간 onTouchEvent()
함수가 자동으로 호출된다. 이 함수에 전달되는 매개변수는 MotionEvent
객체이며, 이 객체에 터치의 종류와 발생 지점(좌푯값)이 담긴다.
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("로그", "Touch down event") } MotionEvent.ACTION_UP -> { Log.d("로그", "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("로그", "Touch down event x : ${event.x}, rawX : ${event.rawX}") } } return super.onTouchEvent(event) } }
x
와 rawX
모두 좌푯값이지만, 의미하는 바는 다르다. x
는 터치 이벤트가 발생한 뷰에서의 좌푯값이고, rawX
는 스크린에서의 좌푯값이다.
따라서 액티비티에 onTouchEvent()
함수를 재정의해서 작성했다면 둘의 차이는 없다. 그런데 터치 이벤트는 특정 뷰에서도 처리할 수 있으므로 onTouchEvent()
함수를 어떤 뷰에 재정의했다면 x
와 rawX
의 값은 차이가 있다.
키 이벤트는 사용자가 폰의 키를 누르는 순간에 발생한다. 액티비티에서 키 이벤트를 처리하려면 다음과 같이 콜백 함수를 재정의해야 한다. 그러면 키 이벤트가 발생할 때 해당 함수가 자동으로 호출된다.
onKeyDown
: 키를 누른 순간의 이벤트onKeyUp
: 키를 떼는 순간의 이벤트onKeyLongPress
: 키를 오래 누르는 순간의 이벤트
- 키 이벤트 처리
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { Log.d("로그", "onKeyDown") return super.onKeyDown(keyCode, event) } override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { Log.d("로그", "onKeyUp") return super.onKeyUp(keyCode, event) }
키 이벤트 함수의 첫 번째 매개변수는 키의 코드이며 이 값으로 사용자가 어떤 키를 눌렀는지 식별할 수 있다.
- 어떤 키를 눌렀는지 식별
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { when(keyCode){ KeyEvent.KEYCODE_0 -> Log.d("로그", "0 키를 눌렀네요") KeyEvent.KEYCODE_A -> Log.d("로그", "A 키를 눌렀네요") } return super.onKeyDown(keyCode, event) }
이러한 키 이벤트가 발생하는 키는 폰에서 제공하는 소프트 키보드의 키를 의미하지 않는다.
앱에서 글을 입력할 때 화면 아래에서 올라오는 키보드를 소프트 키보드(soft keyboard) 라고 한다.
또한, 안드로이드 폰에는 대부분 전원 버튼과 볼륨 조절 버튼이 있다. 그리고 뒤로가기, 홈, 오버뷰 버튼이 있으며 이 버튼들을 포함하고 있는 영역을 내비게이션 바(navigation bar) 라고 한다. 뒤로가기와 볼륨 조절 버튼은 '키'로 취급해 키 이벤트로 처리할 수 있다. 하지만, 전원, 홈, 오버뷰 버튼은 앱에서 이벤트를 처리할 수 없는 버튼이다.
- 뒤로가기 버튼과 볼륨 조절 버튼의 이벤트 처리
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { when(keyCode){ KeyEvent.KEYCODE_BACK -> Log.d("로그", "BACK Button 키를 눌렀네요") KeyEvent.KEYCODE_VOLUME_UP -> Log.d("로그", "Volume Up 키를 눌렀네요") KeyEvent.KEYCODE_VOLUME_DOWN -> Log.d("로그", "Volume Down 키를 눌렀네요") } return super.onKeyDown(keyCode, event) }
특별히 뒤로가기 버튼 이벤트에는 앞에서 살펴본 onKeyDown()
이나 onKeyUp()
함수를 이용할 수 있지만 onBackPressed()
함수를 이용할 수도 있다.
- 뒤로가기 버튼의 이벤트 처리
override fun onBackPressed() { Log.d("로그", "Back Button을 눌렀네요" }