[Android]GestureDetector
GestureDetector에 대해서 알아보도록 한다.
일반적인 onTouch에서 이벤트를 받아서 처리를 하려면 조금 만들어줘야한다.
그러나 이런것들은 만들어져 있다.
interface GestureDetector.OnDoubleTapListener : 두 번 터치했을 경우의 관련 리스너
interface GestureDetector.OnGestureListener : 일반적인 제스처들, 한 번 터치나 스크롤 관련 리스너 인터페이스의 모든 메서드를 반드시 구현해야 한다.
class GestureDetector.SimpleOnGestureListener : 클래스를 확장하여 모든 제스처에 사용할 수 있다. (위의 두개를 모두 포함함)
onDown() : 터치하려고 손을 대기만 해도 호출되는 메서드이며, 모든 제스처의 시작이다.
onSingleTapUp() : 한번 터치 제스처 중에 UP 이벤트가 발생했을 경우, 호출되는 메서드이다.
onSingleTapConfirmed() : 한번 터치 했을 경우, 호출되는 메서드이다.
onDoubleTap() : 두 번 터치를 했을 경우, 호출되는 메서드이다.
onDoubleTapEvent() : 두 번 터치 제스처 중에 DOWN/MOVE/UP 이벤트가 발생했을 경우, 호출되는 메서드이다.
onLongPress() : 길게 눌렀을 경우, 호출되는 메서드이다.
onShowPress() : 터치 화면을 처음 눌렀을 경우, 그러나 손가락을 떼거나 다른곳으로 이동하기 전에 호출되는 메서드이다. 터치가 감지되었음을 시청각적으로 표시하고자 할 때 유용하다.
onScroll() : 손가락으로 화면을 누른 채 손가락을 일정한 속도와 방향으로 움직인 후 떼었을 경우, 호출되는 메서드이다.
onFling() : 손가락으로 화면을 누른 채 가속도를 붙여서 손가락을 움직인 후 떼었을 경우, 호출되는 메서드이다. 이를 던지기(Fling) 또는 튀기기(Flick)라고 부른다. 이 제스처에 대한 일반적인 반응 방식은, 손가락을 뗀 후에도 대상이 일정 기간 동안 계속 움직이게 하는 것이다.
예제.
public class GustureDetectTest extends Activity { private GestureDetector mGestureDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGestureDetector = new GestureDetector(this, mOnSimpleOnGestureListener); } @Override public boolean onTouchEvent(MotionEvent event) { // 여기에서는 터치 이벤트를 넘겨주어서 받고 난후, 리턴값을 돌려준다. // 일반 뷰에 붙여도 된다. return mGestureDetector.onTouchEvent(event); } private GestureDetector.SimpleOnGestureListener mOnSimpleOnGestureListener = new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } @Override public boolean onDown(MotionEvent e) { return false; } @Override public boolean onDoubleTap(MotionEvent e) { return super.onDoubleTap(e); } @Override public boolean onDoubleTapEvent(MotionEvent e) { return super.onDoubleTapEvent(e); } @Override public boolean onSingleTapConfirmed(MotionEvent e) { return super.onSingleTapConfirmed(e); } }; }