Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用“移动”操作拖动对象_Android_Motionevent - Fatal编程技术网

Android 使用“移动”操作拖动对象

Android 使用“移动”操作拖动对象,android,motionevent,Android,Motionevent,我正试图让我画的所有精灵都可以在一个小游戏中拖动。它应该能够触摸任何地方,精灵应该移动相同的距离,手指移动 使用以下方法,他们将在动作移动事件中移动,但移动速度非常慢,距离较短,有时不移动: addToX/Y仅将间隙添加到精灵的坐标 @Override public boolean onTouchEvent(MotionEvent evt){ switch(evt.getAction()){ case MotionEvent.ACTION_DOWN: br

我正试图让我画的所有精灵都可以在一个小游戏中拖动。它应该能够触摸任何地方,精灵应该移动相同的距离,手指移动

使用以下方法,他们将在动作移动事件中移动,但移动速度非常慢,距离较短,有时不移动: addToX/Y仅将间隙添加到精灵的坐标

@Override
public boolean onTouchEvent(MotionEvent evt){
    switch(evt.getAction()){
        case MotionEvent.ACTION_DOWN:
        break;

    case MotionEvent.ACTION_MOVE:
        if(getHistorySize() > 0){
            for(int i = 1, n = evt.getHistorySize(); i < n; i++){
                int calcX = (int) getHistoricalX(i) - (int) getHistoricalX(i-1);
                int calcY = (int) getHistoricalY(i) - (int) getHistoricalY(i-1);
                for(Sprite sprite : spriteList) {
                    sprite.addToX(calcX);
                    sprite.addToY(calcY);
                }
            }
        }
    return true;
}
@覆盖
公共事件(MotionEvent evt){
开关(evt.getAction()){
case MotionEvent.ACTION\u DOWN:
打破
case MotionEvent.ACTION\u移动:
如果(getHistorySize()>0){
for(int i=1,n=evt.getHistorySize();i

有什么想法吗?

假设您的
Sprite
类是
android.view.view
的(可能是间接的)扩展,那么您可以使用
setOnDragListener()
为它们定义
onDrag()
覆盖。然后您可以使用
startDrag(…)
开始拖动。这通常由要拖动的视图上的长按手势触发,但在您的情况下,您可以从
操作中的
onTouchEvent()
中触发它一次(甚至
操作向下
)。有关这些方法的更多详细信息,请参阅

另外,关于您发布的代码,它的一个问题可能解释了为什么它不总是起作用,那就是您只使用历史点(在对
onTouchEvent()
的任何特定调用中可能积累了历史点,也可能没有积累历史点)
大于0,您仍然应该在每次调用
onTouchEvent()
时使用
evt.getX()
evt.getY()
。当然,如果您使用我建议的拖动侦听器方法,您不必担心这一点


按评论更新


如果要同时移动所有精灵,可以将精灵置于全屏
FrameLayout
中,并附加一个
gesturedector
,该检测器使用
gesturedector.SimpleOnGestureListener
捕获
onScroll()
回调,然后调用
scrollTo()
FrameLayout
上。当父级
FrameLayout
滚动时,它的所有子精灵都会一起移动。

问题是,我希望所有精灵只需拖动一次就可以移动,以达到类似滚动的效果。很抱歉,如果我弄错了,但我对此有点陌生。@guennin ah ha。所以有一个ea我会更新我的答案的。