gpt4 book ai didi

android - 在 Android 中使用多点触控实现拖放

转载 作者:行者123 更新时间:2023-11-29 00:40:31 25 4
gpt4 key购买 nike

我正在寻找一种在我的应用程序中通过多点触控实现拖放的方法。我有很多 View ,我希望第一个用户拖动一个 View 的时间与第二个用户拖动另一个 View 的时间相同。

我的单点触摸拖放效果很好,这是我的代码的一部分(我的 View 正在实现这个监听器。onDragStart 记录触摸点,onDragContinuing 改变 View 的位置,onDrop 检查位置是否有效):

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;
}

怎么了?你能帮助我吗 ?谢谢!

最佳答案

我找到了解决方案和解释。

Android 不支持多屏多点触控,多点触控只针对单屏。因此,要为多 View 提供多点触控,我们必须在主 Activity 中捕获触摸事件并为 subview 生成新事件。

感谢 Pascal Welsch 和他的博客 (http://www.passsy.de/multitouch-for-all-views/),以及我发现的对他代码中错误的修改 (http://code.google.com/p/friendbattle/issues/detail?id=19),我已经解决了我的问题。

希望这对其他人有帮助:-)

关于android - 在 Android 中使用多点触控实现拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9672656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com