안드로이드

멀티터치 구현해 보고 소스 올립니다.

raulyo 2012. 4. 16. 15:03

----------------------------------------------------------------------

문제있는  소스 고쳐서 올렸습니다. pc로 터치 좌표

찍으면서 태스트 해봤는데 잘 되는 것 같네요

-----------------------------------------------------------------------

멀티터치 관련 구현하면서 이것 저것  봤는데..

솔직히 좀 난해하더라구요. 뭐 크게 어려운건 아니지만 개념적으로도 그렇고..

별로 대단한 것도 아닌데 상당히 귀찮길래 대충 정리 해서 올립니다.

4개의 변수가 있는데 주석처리 해 놓은 부분에서 관리 하시는 상태처리를 하시면 됩니다.

안드로이드에 맞춰서 개발하기 보단 게임에서 쓸 터치이기 때문에 그냥 처리 했습니다.

자바 잘 못하기 때문에 어색할 수도 있습니다.

대충 설명하면 터치 식별자는 0~멀티터치 가능 수 ( 모릅니다. 적당히 정해서 쓰시길 )

상태변수나 뭐 적당한 처리 만드시고 PUSH가 눌렸을 때 MOVE가 움직일때(드래그)

POP은 오는 순간이 띈거고 띄고 나서도 POP 입니다. 이 부분은 상태 처리 하실 때 적절히 해주세요.

대단한 처리가 아니라 원하는 정보만 주는 것입니다. 궁금하면 덧글 남겨 주세요~

01.static final int MODE_TOUCH_PUSH   = 0,
02.MODE_TOUCH_MOVE   = 1,
03.MODE_TOUCH_POP   = 2,
04.INVALID_POINTER_ID  = -1,
05.SIZE_TOUCH_PACKET  = 20;
06.public boolean onTouchEvent(final MotionEvent event) {
07.int  action = event.getAction();
08.int  touch_id; //터치 식별용
09.int  touch_mode; //터치 상태, 디폴트로 MODE_TOUCH_POP로 해놓고 쓰시면 됩니다.
10.int  x,y;  //터치 좌표
11.switch( action & MotionEvent.ACTION_MASK ){
12.case MotionEvent.ACTION_DOWN: {
13.touch_id = event.getPointerId(0);
14.touch_mode = MODE_TOUCH_PUSH;
15.x   = (int)event.getX();
16.y   = (int)event.getY();
17.//위 정보를 원하는데로 사용하세요.
18.break;
19.}
20.case MotionEvent.ACTION_CANCEL:
21.case MotionEvent.ACTION_UP:{
22.touch_id = event.getPointerId(0);
23.touch_mode = MODE_TOUCH_POP;
24.x   = (int)event.getX();
25.y   = (int)event.getY();
26.//위 정보를 원하는데로 사용하세요.
27.break;
28.}
29.case MotionEvent.ACTION_MOVE:{
30.for(int i=0;i<event.getPointerCount();++i){
31.int pointer_id = event.findPointerIndex(i);
32.if( pointer_id == INVALID_POINTER_ID ) continue;
33.touch_id = i;
34.touch_mode = MODE_TOUCH_MOVE;
35.x   = (int)event.getX();
36.y   = (int)event.getY();
37.//위 정보를 원하는데로 사용하세요.
38.}
39.break;
40.}
41.case MotionEvent.ACTION_POINTER_DOWN:{
42.int pointer_index = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
43.int pointer_id  = event.getPointerId(pointer_index);
44.if( pointer_id != INVALID_POINTER_ID ){
45.touch_id = pointer_index;
46.touch_mode = MODE_TOUCH_PUSH;
47.x   = (int)event.getX(pointer_id);
48.y   = (int)event.getY(pointer_id);
49.//위 정보를 원하는데로 사용하세요.
50.}
51.break;
52.}
53.case MotionEvent.ACTION_POINTER_UP:{
54.int pointer_index = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
55.int pointer_id  = event.getPointerId(pointer_index);
56.if( pointer_id != INVALID_POINTER_ID ){
57.touch_id = pointer_index;
58.touch_mode = MODE_TOUCH_POP;
59.x   = (int)event.getX(pointer_id);
60.y   = (int)event.getY(pointer_id);
61.//위 정보를 원하는데로 사용하세요.
62.}
63.break;
64.}
65.defaultbreak;
66.}
67.return true;
68.}