[안드로이드] 이벤트 - 터치와 키 이벤트

·2022년 5월 14일
0

Doit 안드로이드

목록 보기
7/12
post-thumbnail

이벤트 - 터치와 키 이벤트

터치 이벤트

앱의 화면에서 발생하는 사용자 이벤트는 터치(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)
    }
}

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

키 이벤트

키 이벤트는 사용자가 폰의 키를 누르는 순간에 발생한다. 액티비티에서 키 이벤트를 처리하려면 다음과 같이 콜백 함수를 재정의해야 한다. 그러면 키 이벤트가 발생할 때 해당 함수가 자동으로 호출된다.

  • 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을 눌렀네요"
}
profile
SOOP

0개의 댓글