Android 터치 이벤트

timothy jeong·2021년 10월 31일
0

Android with Kotlin

목록 보기
8/69

터치 이벤트 자체를 처리하는 것은 게임이나 그림판과 같은 앱에서는 많이 쓰이지만 서버와 통신을 주고받는 앱에서는 view 에 정의되어 있는 이벤트를 더 자주 사용한다.

터치 이벤트

앱의 화면에서 발생하는 사용자 이벤트는 터치이다. 앱은 사용자가 터치를 했는지, 스와이프를 했는지 인식하고 그에 알맞게 동작하도록 구현된다.

유저의 터치 이벤트를 처리하고 싶다면 액티비티에 이벤트 콜백 함수인 onTouchEvent() 를 선언하면 된다.

class MainActivity : AppCompatActivity() {

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        return super.onTouchEvent(event)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

이렇게 onTouchEvent() 를 재정의해서 선언해 두면 사용자가 액티비티의 화면을 터치하는 순간 onTouchEvent() 함수가 자동으로 호출된다. 이 함수에 전달되는 매개변수는 MotionEvnet 이며 이 객체에 터치의 종류와 발생 지점이 담긴다.

더 자세한 내용은 안드로이드 일반동작 인식에 대한 문서 를 참고하자.

터치이벤트 종류

터치이벤트에는 3가지가 있다.

  • ACTION_DOWN: 화면을 손가락으로 누르는 순간의 이벤트
  • ACTION_UP: 화면에서 손가락을 떼는 순간의 이벤트
  • ACTION_MOVE: 화면을 손가락으로 누른 채로 이동하는 순간의 이벤트

화면을 눌렀다가 때면 onTouchEvent() 함수는 ACTION_DOWN, ACTION_UP 이벤트 두개가 발생하므로 두번 호출된다.

매개변수로 넘어오는 event 의 action 프로퍼티가 이벤트 정보를 담고있으므로, 이를 참조해서 각 이벤트마다 반응을 다르게 만들 수 있다.

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

터치 이벤트 발생 좌표

터치 이벤트 발생 좌표 역시 확인할 수 있다.

  • x : 이벤트가 발생한 view에서의 x 좌표
  • y : 이벤트가 발생한 view에서의 y 좌표
  • rawX : 화면의 x 좌표
  • rawY : 화면의 y 좌표
override fun onTouchEvent(event: MotionEvent?): Boolean {
    when(event?.action) {
        MotionEvent.ACTION_DOWN -> {
            Log.d("Touch down event at ${event.x} , ${event.y} ... raw (${event.rawX} , ${event.rawY}")
        }
    return super.onTouchEvent(event)
}

onTouchEvent 함수를 액티비티 수준에서 재정의했다면 rawx 와 x 간에 차이가 없겠지만, 특정 view 에서 정의했다면 둘 사이에 차이가 발생한다.

profile
개발자

0개의 댓글