안드로이드
멀티터치 구현해 보고 소스 올립니다.
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.
default
:
break
;
66.
}
67.
return
true
;
68.
}