본문 바로가기
Kotlin

[Kotlin / Android] 08. 사용자 이벤트 처리하기 - 터치와 키 이벤트

by 쀼르쀼르 2024. 3. 5.

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() {
    
    }
})