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

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

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

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

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

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

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

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

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

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

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

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

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

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

static final int MODE_TOUCH_PUSH   = 0,
      MODE_TOUCH_MOVE   = 1,
      MODE_TOUCH_POP   = 2,
      INVALID_POINTER_ID  = -1,
      SIZE_TOUCH_PACKET  = 20;
 public boolean onTouchEvent(final MotionEvent event) {
     int  action = event.getAction();
     int  touch_id; //터치 식별용
  int  touch_mode; //터치 상태, 디폴트로 MODE_TOUCH_POP로 해놓고 쓰시면 됩니다.
  int  x,y;  //터치 좌표
     switch( action & MotionEvent.ACTION_MASK ){
      case MotionEvent.ACTION_DOWN: {
       touch_id = event.getPointerId(0);
       touch_mode = MODE_TOUCH_PUSH;
       x   = (int)event.getX();
       y   = (int)event.getY();
       //위 정보를 원하는데로 사용하세요.
          break;
      }
      case MotionEvent.ACTION_CANCEL:
      case MotionEvent.ACTION_UP:{
       touch_id = event.getPointerId(0);
       touch_mode = MODE_TOUCH_POP;
       x   = (int)event.getX();
       y   = (int)event.getY();
       //위 정보를 원하는데로 사용하세요.
          break;
      }
      case MotionEvent.ACTION_MOVE:{
       for(int i=0;i<event.getPointerCount();++i){
        int pointer_id = event.findPointerIndex(i);
        if( pointer_id == INVALID_POINTER_ID ) continue;
        touch_id = i;
        touch_mode = MODE_TOUCH_MOVE;
        x   = (int)event.getX();
        y   = (int)event.getY();
        //위 정보를 원하는데로 사용하세요.
       }
          break;
      }
      case MotionEvent.ACTION_POINTER_DOWN:{
       int pointer_index = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
       int pointer_id  = event.getPointerId(pointer_index);
       if( pointer_id != INVALID_POINTER_ID ){
        touch_id = pointer_index;
        touch_mode = MODE_TOUCH_PUSH;
        x   = (int)event.getX(pointer_id);
        y   = (int)event.getY(pointer_id);
        //위 정보를 원하는데로 사용하세요.
       }
       break;
      }
      case MotionEvent.ACTION_POINTER_UP:{
       int pointer_index = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
       int pointer_id  = event.getPointerId(pointer_index);
       if( pointer_id != INVALID_POINTER_ID ){
        touch_id = pointer_index;
        touch_mode = MODE_TOUCH_POP;
        x   = (int)event.getX(pointer_id);
        y   = (int)event.getY(pointer_id);
        //위 정보를 원하는데로 사용하세요.
       }
          break;
      }
      default: break;
     }
     return true;
    }


 

profile