구글에 멀티 터치 관련하여 자료를 검색해보면 좌표 반환에 대한 예제는 많이 나옵니다.
그 예제를 이용하여 내가 선택한 위젯(버튼, 뷰 등등), 멀티 위젯 처리를 하는 방법을 소개합니다.
멀티 터치가 아닌 원 터치 콜백 리스너로 기본 (View, Event) 인스턴스를 제공합니다.
그렇다면 멀티 터치에 대한 모든 View들은 어떻게 반환 받을 수 있을가요?
네 저도 모릅니다. 자세하게 찾아보지는 않았지만 저는 터치 좌표값과 뷰의 좌표값을 비교하여 처리하도록 하였습니다.
여기서 주의 할것은 뷰의 구조에 따라 좌표값이 틀리다는 것입니다.
이점 주의하시고 코딩하셔야합니다.
좌표를 얻기 위한 Touch 콜백 메서드
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;
}
}
위 함수를 이용하여 x[],y[] 좌표값을 얻어올수 있습니다.
그리고 collision 메서드는 충돌 체크 메서드입니다.
아래는 충돌을 체크하는 메서드
// 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;
}
위 메서드는 3개의 인자를 받습니다.
View : 두번째 세번째 인자가 해당 뷰에 포함이 되는지 체크하기 위한 인스턴스
x, y : 터치 좌표값
이상입니다.
끝.
참조
- android-get-bounding-rectangle-of-a-view
- how-to-code-for-multitouch
- Making Sense of Multitouch