08-1 터치와 키 이벤트
터치 이벤트
터치(touch)
- 앱의 화면에서 발생하는 사용자 이벤트
- 손가락으로 화면을 잠시 눌렀다가 떼는 행위
스와이프(swipe)
- 화면에 손가락을 댄 상태로 쓸어 넘기는 동작
앱의 화면에서 발생하는 사용자의 터치 이벤트를 처리하고 싶다면
액티비티 클래스에 터치 이벤트의 콜백 함수인 onTouchEvent( )를 선언하면 됨
콜백 함수
- 어떤 이벤트가 발생하거나 시점에 도달했을 때 시스템에서 자동으로 호출하는 함수
· 터치 이벤트 처리
class MainActivity : AppCompatActivity() {
(... 생략 ...)
override fun onTouchEvent(event: MotionEvent?): Boolean {
return super.onTouchEvent(event)
}
}
액티비티에 onTouchEvent( ) 함수를 재정의(override)해서 선언만 해놓으면
사용자가 이 액티비티 화면을 터치하는 순간 onTouchEvent( ) 함수가 자동으로 호출됨
onTouchEvent( ) 함수에 전달되는 매개변수는 MotionEvent 객체이며,
이 객체에 터치의 종류와 발생 지점(좌푯값)이 담김
터치 이벤트의 종류
- ACTION_DOWN : 화면을 손가락으로 누른 순간의 이벤트
- ACTION_UP : 화면에서 손가락을 떼는 순간의 이벤트
- ACTION_MOVE : 화면을 손가락으로 누른 채로 이동하는 순간의 이벤트
· 터치 이벤트 처리
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 모두 좌푯값임 but 의미하는 바는 다름
x는 터치 이벤트가 발생한 뷰에서의 좌푯값
rawX는 스크린, 즉 화면에서의 좌푯값
키 이벤트
키 이벤트는 사용자가 폰의 키를 누르는 순간에 발생
액티비티에서 키 이벤트를 처리하려면 콜백 함수를 재정의해야 함
그러면 키 이벤트가 발생할 때 해당 함수가 자동으로 호출됨
- onKeyDown : 키를 누른 순간의 이벤트
- onKeyUp : 키를 떼는 순간의 이벤트
- onKeyLongPress : 키를 오래 누르는 순간의 이벤트
· 키 이벤트 처리
class MainActivity2 : AppCompatActivity() {
(... 생략 ...)
override fun onKeyDown(KeyCode: Int, event: KeyEvent?): Boolean {
Log.d("kkang", "onKeyDown")
return super.onKeyDown(keyCode, event)
}
override fun onKeyUp(KeyCode: Int, event: KeyEvent?): Boolean {
Log.d("kkang", "onKeyUp")
return super.onKeyUp(keyCode, event)
}
}
키 이벤트 함수의 첫 번째 매개변수는 키의 코드이며
이 값으로 사용자가 어떤 키를 눌렀는지 식별할 수 있음
· 어떤 키를 눌렀는지 식별
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
when (keyCode) {
KeyEvent.KEYCODE_0 -> Log.d("kkang", "0 키를 눌렀네요")
KeyEvent.KEYCODE_A -> Log.d("kkang", "A 키를 눌렀네요")
}
return super.onKeyDown(keyCode, event)
}
소프트 키보드의 키는 키 이벤트로 처리할 수 없음
-> 안드로이드 시스템에 등록된 앱으로서 키를 누르면 글은 입력되지만 키 이벤트는 발생하지 않음
하드웨어 키보드의 키는 키 이벤트로 처리할 수 있음
안드로이드 시스템 버튼도 키로 취급하므로 이벤트 처리 가능
안드로이드 폰에서 대부분 제공하는 버튼
전원 버튼, 볼륨 조절 버튼, 뒤로가기(◁) 버튼, 홈(○) 버튼, 오버뷰(□) 버튼
내비게이션 바(navigation bar)
- 뒤로가기(◁) , 홈(○) , 오버뷰(□) 버튼을 포함하는 영역
- 실행되는 앱과 상관없이 안드로이드자체에서 제공하는 시스템 바
* 오버뷰 버튼은 최근에 사용한 앱 목록을 보여줌
뒤로가기 버튼과 볼륨 조절 버튼은 '키'로 취급해
키 이벤트로 처리할 수 있음
but 전원, 홈, 오버뷰 버튼은 액티비티에
onKeyDown( ) 함수를 선언해 놓아도
사용자가 버튼을 눌렀을 때 함수 호출되지 않음
즉, 앱에서 이벤트 처리할 수 없는 버튼임
· 뒤로가기 버튼과 볼륨 조절 버튼의 이벤트 처리
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
when (keyCode) {
KeyEvent.KEYCODE_BACK -> Log.d("kkang", "BACK Button을 눌렀네요")
KeyEvent.KEYCODE_VOLUME_UP -> Log.d("kkang", "Volume Up 키를 눌렀네요")
KeyEvent.KEYCODE_VOLUME_DOWN -> Log.d("kkang", "Volume Down키를 눌렀네요")
}
return super.onKeyDown(keyCode, event)
}
· 뒤로가기 버튼의 이벤트 처리
override fun onBackPressed() {
Log.d("kkdang", "Back Button을 눌렀네요")
}
현재는 androidx.activity.OnBackPressedCallback( ) 함수 이용을 권장함
· 뒤로가기 버튼의 이벤트 처리
OnBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
}
})
'Kotlin' 카테고리의 다른 글
[Kotlin / Android] 09. 리소스 활용하기 - 리소스의 종류와 특징 (1) | 2024.03.11 |
---|---|
[Kotlin / Android] 08. 사용자 이벤트 처리하기 - 시계 앱의 스톱워치 기능 만들기 (0) | 2024.03.09 |
[Kotlin / Android] 08. 사용자 이벤트 처리하기 - 뷰 이벤트 (0) | 2024.03.06 |