in Android

android – multi touch

구글에 멀티 터치 관련하여 자료를 검색해보면 좌표 반환에 대한 예제는 많이 나옵니다.
그 예제를 이용하여 내가 선택한 위젯(버튼, 뷰 등등), 멀티 위젯 처리를 하는 방법을 소개합니다.

멀티 터치가 아닌 원 터치 콜백 리스너로 기본 (View, Event) 인스턴스를 제공합니다.
그렇다면 멀티 터치에 대한 모든 View들은 어떻게 반환 받을 수 있을가요?

네 저도 모릅니다. 자세하게 찾아보지는 않았지만 저는 터치 좌표값과 뷰의 좌표값을 비교하여 처리하도록 하였습니다.

여기서 주의 할것은 뷰의 구조에 따라 좌표값이 틀리다는 것입니다.
이점 주의하시고 코딩하셔야합니다.

좌표를 얻기 위한 Touch 콜백 메서드
[sourcecode language="java"]
private final int TOUCH_MAX_NUM = 3;
@Override
public boolean onTouch(View v, MotionEvent event) {
float xEvent[] = new float[ TOUCH_MAX_NUM ];
float yEvent[] = new float[ TOUCH_MAX_NUM ];
switch( event.getPointerCount() ) {
case 1:
xEvent[ 0 ] = event.getX( 0 );
yEvent[ 0 ] = event.getY( 0 );

switch( event.getAction() ) {
case MotionEvent.ACTION_DOWN:
collision(xEvent[0], yEvent[0]);
return true;
default: return super.onTouchEvent( event );
}

case 2:
for (int i=0; i < TOUCH_MAX_NUM; i++) {
xEvent[i] = event.getX(i);
yEvent[i] = event.getY(i);
}
int touchCnt = event.getPointerCount();

switch( event.getAction() ) {
case MotionEvent.ACTION_POINTER_1_DOWN:
case MotionEvent.ACTION_POINTER_2_DOWN:
case MotionEvent.ACTION_POINTER_3_DOWN:
for (int i=0; i < touchCnt; i++) {
collision(xEvent[i], yEvent[i]);
}
break;
default: return super.onTouchEvent( event );
}
default: return false;
}
}
[/sourcecode]
위 함수를 이용하여 x[],y[] 좌표값을 얻어올수 있습니다.
그리고 collision 메서드는 충돌 체크 메서드입니다.

아래는 충돌을 체크하는 메서드
[sourcecode language="java"]
// getLocationInWindow는 int형 타입의 배열2개를 인자로 받습니다.
private boolean isViewContains(View view, float rx, float ry) {
int[] l = new int[2];
view.getLocationInWindow(l);
int x = l[0];
int y = l[1];
int w = view.getWidth();
int h = view.getHeight();
if (rx < x || rx > x + w || ry < y || ry > y + h) {
return false;
}
return true;
}
[/sourcecode]
위 메서드는 3개의 인자를 받습니다.
View : 두번째 세번째 인자가 해당 뷰에 포함이 되는지 체크하기 위한 인스턴스
x, y : 터치 좌표값
이상입니다.
끝.

참조
- android-get-bounding-rectangle-of-a-view
- how-to-code-for-multitouch
- Making Sense of Multitouch

Write a Comment

Comment