FROM : http://cafe.naver.com/sunschool.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4394&

일반적으로 터치 이벤트는 down-move-up 단계를 거치면서 사용자의 동작을 감지할 수 잇다. 이런 사용자의 조합된 모션(제스쳐)를 쉽게 판별할 수 있도록 안드로이드는 GestureDetector 인터페이스를 제공하고 있다.

 

GestureDetector는 두가지의 Listener를 가지고 있다.

 

interface GestureDetector.OnDoubleTapListener    // 두번 터치 했을때

interface GestureDetector.OnGestureListener        // 일반적인 제스쳐

 

위의 두가지를 다가지고 있는 클래스가 GestureDetector.SimpleOnGestureListener 이다.

이클래스를 상속받으면 모든 Gesture를 다 사용할 수 있다.

사용방법:

     GestureDetector gd=new GestureDetector(this,new SimpleGestureListener());

     gd.onTouchEvent(event);   // 감시할 MotionEvent를 아규먼트로 설정하여 GestureDetector를 설정한다.

 

각 제스쳐 이벤트를 처리하는 메서드들

 

case1:   아주 살짝 터치하게 되면

             onDown

             onSingleTapUp        <- 30~60ms 후에 손이 떨어지면 발생
             onSingleTabConfirmed    <- onDown 이벤트 발생후 300ms 안에 onDown 이벤트가 다시 발생하지 않을때 발생
 

case2:   살짝 터치하게 되면

             onDown

             onShowPress          <- case1보다 조금 길게, 90-100ms 정도 터치되면 발생

             onSingleTapUp        <-  172ms 이후에 손을 떼면 발생
             onSingleTabConfirmed    <- onDown 이벤트 발생후 300ms 안에 onDown 이벤트가 다시 발생하지 않을때 발생
 

case3:   약간 길게 터치 되면

             onDown

             onShowPress          <- 100ms 정도 터치되면 발생

             onSingleTapUp        <-  300ms 이후 손을 떼게 되면 onSingleTabConfirmed는 발생하지 않는다.           
 

case4:  아주 길게 터치 되면

             onDown

             onShowPress          <- 100ms 정도 터치되면 발생           

             onLongPress           <- 590~600ms 정도에 발생. 이때 onSingleTabUp은 발생하지 않는다.

 

case4:  두번 터치 하게 되면

             onDown

             onSingleTabUp

             onDoubleTab     <- onSingleTabConfirmed가 발생하기 전에 다시 onDown 이벤트가 들어오게 되면 발생

             onDown        <- onDoubleTab 이벤트보다 빨리 들어올 수 도 있지만 일반적으로 늦게 들어온다.

 

case5:  두번 터치하게 되면
             onDown
             onSingleTapUp
             onDoubleTapEvent     <- onSingleTapConfirmed가 발생하기전에 다시 onDown 이벤트가 들어오게 되면 발생
             onDown                    <- 이건 onDoubleTap보다 먼저 들어올수도 늦게 들어올 수 도 있다.

             onDoubleTapEvent     <- 첫번째 DoubleTapEvent는 ACTION_DOWN, 이것은 ACTION_UP

             onDoubleTap과 onDoubleTapEvent와의 차이는 DOWN,NOVE,UP 이벤트까지 모두 캐치된다는 점이다.

 

case6:  스크롤

             onDown

             onScroll   <- 최소 30ms 이후부터 onScroll 이벤트가 발생할 수 있으며, 플링시키지 않고 살며시 손을 떼면
                                끝까지 onScroll 이벤트가 연속으로 발생한다.
 
case7: 플링

             onDown

             onScroll  
             onFling   <- 스크롤과 비슷하지만 마지막에 손가락을 약간 튕기게 되면 플링으로 인식된다.

 

 

 [사용코드예제]

 

package kim.android.test;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.TextView;
import android.widget.Toast;

 

public class GestureTestActivity extends Activity implements OnGestureListener {

 

  private GestureDetector gd;
 
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
     // TODO Auto-generated method stub
     super.onCreate(savedInstanceState);
     gd = new GestureDetector(this);
     TextView text=new TextView(this);
     text.setText("제스쳐테스트");
     text.setTextColor(Color.GREEN);
     text.setTextSize(20);
     setContentView(text);
   }
 
 
   // Activity의 onTouchEvent가 발생되면 이것을 GestureDetector의 onTouchEvent로
   // 등록해줌으로써 액티비티의 이벤트를 제스쳐로 처리되도록 한다.
   @Override
   public boolean onTouchEvent(MotionEvent event) {
       // TODO Auto-generated method stub
       return gd.onTouchEvent(event);
   }

 

   // 터치하려고 손을 대기만 해도 발생되는 이벤트, 모든 제스쳐의 시작
   @Override
   public boolean onDown(MotionEvent arg0) {
      // TODO Auto-generated method stub
      Toast.makeText(this, "onDown 이벤트 발생", Toast.LENGTH_SHORT).show();
      Log.i("GestureTestActivity", "onDown called");
      return true;
   }

 

    // 드래그하다 띄면 호출됨.
    // onScroll 이벤트와 비슷하지만 끝에 살짝 튕기는 동작에서 발생되는 이벤트
   @Override
   public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
          // TODO Auto-generated method stub
          Toast.makeText(this, "onFling 이벤트 발생", Toast.LENGTH_SHORT).show();
          return true;
    }

 

   // 길게 누르면 호출됨(약 590~600ms 정도 누를때 호출됨)
   @Override
   public void onLongPress(MotionEvent e) {
         // TODO Auto-generated method stub
         Toast.makeText(this, "onFling 이벤트 발생", Toast.LENGTH_SHORT).show();

    }
 
    // 터치하면 호출됨. 100ms 정도 누를때 호출됨
    @Override
     public void onShowPress(MotionEvent e) {
           // TODO Auto-generated method stub
          Toast.makeText(this, "onShowPress 이벤트 발생", Toast.LENGTH_SHORT).show();

     }
 
     // 드래그시 호출. 최소 30ms 이후부터는 onScroll 이벤트가 발생할 수 있으며,
     // 플링시키지 않고 살며시 손을 떼면 끝까지 onScroll 이벤트만 연속으로 발생
    @Override
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {
           // TODO Auto-generated method stub
           Toast.makeText(this, "onScroll 이벤트 발생", Toast.LENGTH_SHORT).show();
           return true;
     }

 

     // 한번 터치하고 다음에 다시 터치 이벤트가 들어오지 않았을때,
     // 한번 터치가 확실하다고 확인 시켜주는 이벤트
     @Override
     public boolean onSingleTapUp(MotionEvent e) {
           // TODO Auto-generated method stub
          Toast.makeText(this, "onSingleTapUp 이벤트 발생", Toast.LENGTH_SHORT).show();
          return true;
     }

}

   

+ Recent posts