android Multi Touch 어느정도 와꾸만 잡아봄...
가능한 기능
싱글터치
싱글 플리크
두손가락 터치(멀티)
두손가락 플리크
핀치 투 줌
아직 허술한 부분이 많긴한데...좀 더 깔끔하게 고치고싶다
참고 사이트
주) 일본어 사이트에여
http://kenkenppa.seesaa.net/article/280101239.html
static final int NONE = 0;
static final int ONE_TOUCH = 1;
static final int MULTI_TOUCH = 2;
static final int TWO_TOUCH_DRAG = 3;
static final int ZOOM_IN_OUT = 4;
static final int ONE_TOUCH_DRAG = 5;
int mode = NONE;
int TouchDown_1X = 0;
int TouchDown_1Y = 0;
int TouchDown_2X = 0;
int TouchDown_2Y = 0;
int TouchUp_1X = 0;
int TouchUp_1Y = 0;
int TouchUp_2X = 0;
int TouchUp_2Y = 0;
//온터치 부분
@Override
public boolean onTouchEvent(MotionEvent event)
{
//gesture와 연결
gesture.onTouchEvent(event);
int action = event.getAction();
int index = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int eventID = event.getPointerId(index);
int pointerIndex = event.findPointerIndex(eventID);
touchCount = event.getPointerCount();
//pointerIndex를 사용하는 이유는 안드로이드 자체에서 일반적으로 인덱스만 입력하게되면 정확하게 다운, 업 당시의 포인터 인덱스를 가지고 오지 못하기때문이다...
//Moving (Drag, Pinchi zoom )event에서는 Action_Move가 계속 반복된다.
/*
* ** 드래그 이벤트 명세 **
* NONE : 일반 / ONE_TOUCH : 한 손가락 터치했을때의 명세 /MULTI_TOUCH : 한 손가락 이상 터치한 경우
* ONE_TOUCH_DRAG : 한 손가락으로 플리크 / TWO_TOUCH_DRAG : 두손가락으로 플리크 / ZOOM_IN_OUT : 줌인 줌아웃 이벤트.
* DoubleTap 이벤트는 하단의 메소드를 이용하면 될듯 하다....DoubleTapUp , DoubleTapEvent 참조.
*
*/
// 순수한 액션값을얻기위해 AND연산
switch(action & event.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
//ActionDown
Log.i("OnTouchEvent", "Action_Down_Event");
mode =ONE_TOUCH;
TouchDown_1X = (int) event.getX(pointerIndex);
TouchDown_1Y = (int) event.getY(pointerIndex);
Log.i("OnTouchEvent", "mode" + mode);
break;
case MotionEvent.ACTION_POINTER_DOWN:
Log.i("OnTouchEvent", "Action_Pointer_Down_Event");
mode = MULTI_TOUCH;
TouchDown_2X = (int) event.getX(pointerIndex);
TouchDown_2Y = (int) event.getY(pointerIndex);
Log.i("OnTouchEvent", "mode" + mode);
break;
case MotionEvent.ACTION_UP:
Log.i("OnTouchEvent", "Action_up_Event");
Log.i("OnTouchEvent", "mode" + mode);
TouchUp_1X = (int) event.getX(pointerIndex);
TouchUp_1Y = (int) event.getY(pointerIndex);
// 업 이벤트 당시 멀티터치 이벤트면 다음 이벤트로 넘어간다.
if(mode==ONE_TOUCH)
{
mode = ONE_TOUCH_DRAG;
}
else
{
mode = MULTI_TOUCH;
return true;
}
//한 손가락으로 플리크할 경우의 이벤트 처리 할 떄.(컨텐츠 이동)
if(mode == ONE_TOUCH_DRAG)
{
if(TouchDown_1X - TouchUp_1X >0)
{
Toast.makeText(mContext, "Left1", Toast.LENGTH_SHORT).show();
}
else if(TouchDown_1X - TouchUp_1X < 0)
{
Toast.makeText(mContext, "Right1", Toast.LENGTH_SHORT).show();
}
mode = NONE;
}
//모드 초기화
mode = NONE;
break;
case MotionEvent.ACTION_POINTER_UP:
TouchUp_2X = (int) event.getX(pointerIndex);
TouchUp_2Y = (int) event.getY(pointerIndex);
if(DEBUG)
{
Log.i("OnTouchEvent", "Action_Pointer_up_Event");
Log.i("OnTouchEvent", "mode" + mode);
Log.i("TouchCount", "TouchDown_1X" + TouchDown_1X);
Log.i("TouchCount", "TouchDown_1Y" + TouchDown_1Y);
Log.i("TouchCount", "TouchDown_2X" + TouchDown_2X);
Log.i("TouchCount", "TouchDown_2Y" + TouchDown_2Y);
Log.i("TouchCount", "TouchUp_1X" + TouchUp_1X);
Log.i("TouchCount", "TouchUp_1Y" + TouchUp_1Y);
Log.i("TouchCount", "TouchUp_2X" + TouchUp_2X);
Log.i("TouchCount", "TouchUp_2Y" + TouchUp_2Y);
}
if(event.getPointerCount() >1 )
{
//두 손가락으로 플리크 혹은 줌 인 아웃
if(mode == MULTI_TOUCH)
{
//오른쪽으루
if(TouchDown_1X - TouchUp_1X > 0 && TouchDown_2X- TouchUp_2X >0)
{
//원하는 이벤트
}
// 왼쪽으루
else if(TouchDown_1X - TouchUp_1X < 0 && TouchDown_2X- TouchUp_2X < 0)
{
// 원하는 이벤트 넣어주세요
}
// 줌인 줌아웃 (좀더 조건을 추가해서 세세하게 컨트롤 하고 싶지만, 추가하고 나니 너무 많이 제약이 걸려서(-_-;; ))
else if((TouchDown_1X - TouchUp_1X >0 && TouchDown_2X-TouchUp_2X < 0) || (TouchDown_1X - TouchUp_1X < 0 && TouchDown_2X-TouchUp_2X > 0 ))
{
mode = ZOOM_IN_OUT;
return true;
}
else
{
mode = NONE;
return true;
}
mode = NONE;
}
}
//모드 초기화
mode = NONE;
Log.i("OnTouchEvent", "mode" + mode);
break;
case MotionEvent.ACTION_MOVE:
Log.i("OnTouchEvent", "Action_move_Event");
Log.i("OnTouchEvent", "mode" + mode);
break;
}
//Gesture Event에서 return true, false의 의미는 이상태에서 다음 제스쳐로 진행 유무를 판단하는 것이라고 합니다...
return false;
}//OnTouchEvent End
하부에는 기타 온터치 이벤트 관련 메소드들이 쭉 있겠네요 :)