Computer/Android

android Multi Touch 어느정도 와꾸만 잡아봄...

TOYOBA 2013. 3. 20. 14:27

가능한 기능

싱글터치

싱글 플리크

두손가락 터치(멀티)

두손가락 플리크 

핀치 투 줌


아직 허술한 부분이 많긴한데...좀 더 깔끔하게 고치고싶다



참고 사이트

주) 일본어 사이트에여 

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


하부에는 기타 온터치 이벤트 관련 메소드들이 쭉 있겠네요 :)