GestureDetector 파헤치기

Android GestureDetector 파헤치기

스마트폰의 가장 필수인 터치 이벤트 처리입니다. 예를 들어 스크롤의 특정 가속도가 일어나면 UI를 변경 하는것 부터 시작 해서 사용자 입력에 대한 처리를 해야 합니다.

이 안드로이드 OS에서는 개발자가 이런 터치이벤트를 구현을 쉽게 하기 위해서 GestureDetector라는 클래스를 제공합니다.

GestureDetector를 이용하면 스크롤의 가속도, 더블탭, 롱 프레스등의 이벤트를 쉽게 받을 수 있습니다.

그럼 하나하나 자세히 알아 보도록 하겠습니다.

GestureDetector는 기본적으로 다음과 같은 인터페이스와 클래스를 제공합니다.

1. onDoubleTapListener interface

: 두변 연속으로 터치를 감지하는 리스너

2. onGestureListener interface

: 스크롤이나 터치등 일반적인 제스쳐를 감지 하는 리스너

3. SimpleOnGustureListener class

: extends하여 모든 제스쳐들은 좀더 다양한 이벤트로 감지 할 수 있다.

onDoubleTap

: 연속 두번 터치시 발생

  @Override
    public boolean onDoubleTap(MotionEvent e) {
        return super.onDoubleTap(e);
    }

onDoubleTapEvent

: DOWN, UP, MOVE 이벤트가 모두 발생 된다,

 
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        return super.onDoubleTapEvent(e);
    }

onDown

: 화면에 손을 터치 할려고 손을 대는 순간 이벤트가 발생 되며, 모든 이벤트의 시작이다.

  @Override
    public boolean onDown(MotionEvent e) {
        return super.onDown(e);
    }

onFling

: 스크롤도중 가속도를 가하면 발생 되는 이벤트이다. velocityX와 velocityY의 가속도 값이 들어 온다.

 @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        return super.onFling(e1, e2, velocityX, velocityY);
    }

onLongPress

: 길게 눌렀을 경우 발생 된다.

  @Override
    public void onLongPress(MotionEvent e) {
        super.onLongPress(e);
    }

onScroll

: 스크롤시 발생 된다. 최초 위치와 나중위치의 거리를 확인 할 수 있는 distanceX, distanceY값이 들어 온다.

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
            float distanceX, float distanceY) {
        return super.onScroll(e1, e2, distanceX, distanceY);
    }

onShowPress

: 아주 길게 눌렀을 경우 발생 된다.

   @Override
    public void onShowPress(MotionEvent e) {
        super.onShowPress(e);
    }

onSingleTapConfirmed

: 한번 터치가 확실 할 경우 발생 된다. DoubleTap이 아니다.

 @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        return super.onSingleTapConfirmed(e);
    }

onSingleTapUp

: 한번 터치일 경우 발생 된다. DoubleTap일 수도 있다.

   @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return super.onSingleTapUp(e);
    }

그럼 실제 터치에 대해 어떤 이벤트가 순서대로 발생 하는지 알아보자.

아주 살짝 터치 한다.(스치는 정도 30~60ms )

onDown (0ms)

onSingleTapUp (30~60ms) 손이 떨어 지면 발생

onSingleTapConfirmed (~300ms) onDown에 재 발생 되지 않았을 경우

살짝 터치 한다.(90~100ms )

onDown (0ms)

onShowPress (90~100ms)

onSingleTapConfirmed (~300ms) onDown에 재 발생 되지 않았을 경우

onSingleTapUp (170ms) 손이 떨어 지면 발생

onSingleTapConfirmed (~300ms) onDown에 재 발생 되지 않았을 경우

 

약간 길게 터치한다.

onDown (0ms)

onShowPress (100ms)

onSingleTapUp (300ms) ~300ms안에 onDown이 재 발생 되지 않았을 경우

아주 길게 터치한다.(590~600ms)

onDown (0ms)

onShowPress (100ms)

onLongPress (590~600ms) 300ms보다 더 길게 누르면 onSingleTapUp은 발생 되지 않는다.

연속 두번 터치한다.

onDown (0ms)

onSingleTabUp

onDoubleTab onSingleTapConfirmed 발생 되기전 onDown이 호출 되면 발생 한다.

onDown onDoubleTab 이벤트 보다 빨리 들어 오는 경우도 있다. 일반적으로는 onDoubleTab발생 후에 들어 온다.

스크롤 한다.(천천히)
onDown (0ms)
onScroll 최초 30ms이후 후터 발생되며, 가속도가 발생되지 않는한 이벤트가 연속으로 발생 된다.
스크롤 한다.(가속도로 튕긴다)
onDown(0ms)
onScroll
onFling onScroll발생 후 가속하게 되면 발생 된다.
이렇게 사용자의 액션에 따라 각각이벤트가 발생된다. 
ViewPager나 MenuDrawer등의 Open Source는 GestureDetector를 기본으로 하고 있기 때문에 한번쯤 찾아서 구현방식을 찾아 보면 많은 도움이 될듯 하다.
 

댓글 남기기