2
我正在寻找一种在我的应用程序中实现多点触控拖放的方法。 我有很多意见,我希望第一个用户在拖动视图的同时拖动另一个视图。 (我的视图正在实现这个监听器,onDragStart记录了被触摸的点,onDragContinuing改变视图的位置,onDrop检查位置是否有效)我的单触式拖放效果很好,这里是我的代码的一部分:在Android中使用多点触控实现拖放
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;
}
有什么不对?你可以帮我吗 ?谢谢 !