2012-03-12 3 views
2

내 응용 프로그램에서 멀티 터치로 드래그 앤 드롭을 구현하는 방법을 찾고 있습니다. 많은 뷰가 있는데 첫 번째 사용자가 두 번째 사용자가 다른 뷰를 드래그하는 것과 같은 시간에 뷰를 드래그하도록하고 싶습니다.Android에서 멀티 터치로 끌어서 놓기 구현

내 단일 터치 끌어서 놓기가 잘 작동합니다. 내보기에서이 수신기를 구현하고 있습니다. onDragStart는 터치 한 지점을 기록하고 onDragContinuing은보기의 위치를 ​​변경하고 위치가 유효한지 확인합니다. :

public boolean onTouch(View v, MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     return onDragStart(event.getX(), event.getY()); 
    } 

    else if (event.getAction() == MotionEvent.ACTION_MOVE){ 
     return onDragContinuing(event.getRawX(), event.getRawY());      
    } 

    else if (event.getAction() == MotionEvent.ACTION_UP){ 
     return onDrop(event.getRawX(), event.getRawY()); 
    } 

    else{ 
     return false; 
    } 

} 

그 같은 멀티 터치를 구현하기 위해 노력했다,하지만하지 작업을 수행합니다

잘못 무엇
private static final int INVALID_POINTER_ID = -1; 
// The ‘active pointer’ is the one currently moving our object. 
private int mActivePointerId = INVALID_POINTER_ID; 

public boolean onTouch(View v, MotionEvent event) { 

    int action = event.getAction(); 
    int actionCode = action & MotionEvent.ACTION_MASK; 

    switch(actionCode){ 

     case MotionEvent.ACTION_DOWN :{ 
      Toast.makeText(getContext(), "down", Toast.LENGTH_SHORT).show(); 
      // Save the ID of this pointer 
      mActivePointerId = event.getPointerId(0); 
      return onDragStart(event.getX(), event.getY()); 
     } 

     case MotionEvent.ACTION_POINTER_DOWN :{ 
      Toast.makeText(getContext(), "pointer down", Toast.LENGTH_SHORT).show(); 
      // Save the ID of this pointer 
      // Extract the index of the pointer that left the touch sensor 
      final int pointerIndex = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
      mActivePointerId = event.getPointerId(pointerIndex); 
      return onDragStart(event.getX(mActivePointerId), event.getY(mActivePointerId)); 
     } 

     case MotionEvent.ACTION_MOVE :{ 
      Toast.makeText(getContext(), "move", Toast.LENGTH_SHORT).show(); 
      final int pointerIndex = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
      final int mCurrentPointerId = event.getPointerId(pointerIndex); 
      if (mActivePointerId == mCurrentPointerId){ 
       return onDragContinuing(getRawX(event, mActivePointerId), getRawY(event, mActivePointerId)); 
      } 
      else return false; 
     } 

     case MotionEvent.ACTION_UP :{ 
      Toast.makeText(getContext(), "up", Toast.LENGTH_SHORT).show(); 
      final int pointerIndex = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
      final int mCurrentPointerId = event.getPointerId(pointerIndex); 

      if (mActivePointerId == mCurrentPointerId){ 
       return onDrop(event.getRawX(), event.getRawY()); 
      } 
      else return false; 

     } 

     case MotionEvent.ACTION_POINTER_UP :{ 
      Toast.makeText(getContext(), "pointer up", Toast.LENGTH_SHORT).show(); 
      final int pointerIndex = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
      final int mCurrentPointerId = event.getPointerId(pointerIndex); 

      if (mActivePointerId == mCurrentPointerId){ 
       return onDrop(getRawX(event, pointerIndex), getRawY(event, pointerIndex)); 
      } 
      else return false; 

     } 

     default :{ 
      return false; 
     } 

    } 

} 

/** 
* MotionEvent has no getRawX(int) method; simulate it pending future API approval. 
*/ 
private static float getRawX(MotionEvent event, int pointerIndex) { 
    float offset = event.getX() - event.getRawX(); 
    return event.getX(pointerIndex) + offset; 
} 

/** 
* MotionEvent has no getRawY(int) method; simulate it pending future API approval. 
*/ 
private static float getRawY(MotionEvent event, int pointerIndex) { 
    float offset = event.getY() - event.getRawY(); 
    return event.getY(pointerIndex) + offset; 
} 

를? 너 나 좀 도와 줄 수있어? 감사합니다 !

답변

2

해결책과 설명을 찾았습니다.

Android는 멀티보기에서 멀티 터치를 지원하지 않지만 멀티 터치는 단일보기에서만 지원됩니다. 따라서 다중보기를 위해 멀티 터치를 사용하려면 주 활동에서 터치 이벤트를 잡고 하위보기에 대한 새 이벤트를 생성해야했습니다.

파스칼 웨일스 (Pascal Welsch)와 그의 블로그 (http://www.passsy.de/multitouch-for-all-views/) 덕분에 내가 찾은 코드 (http://code.google.com/p/friendbattle/issues/detail?id=19)의 실수를 수정하여 문제를 해결했습니다.

희망이 있으면 다른 사람들에게 도움이 될 것입니다 :-)