使用ACTION_MOVE拖动对象

时间:2014-03-06 07:32:31

标签: android motionevent

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

使用以下方法,他们将移动ACTION_MOVE事件,但只是非常慢,距离较短,有时他们不会: 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;
}

有关于此的任何想法吗?

1 个答案:

答案 0 :(得分:1)

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

此外,关于您发布的代码,其中的一个问题可能解释为什么它并不总是有效的是您只使用历史点(可能会或可能不会在任何特定的{{ {1}})。无论ACTION_DOWN是否大于0,您仍应在每次调用onTouchEvent()时使用getHistorySize()evt.getX()。但是,当然,如果您使用我建议的拖动侦听器方法,您将不需要担心这一点。


每条评论更新

如果您想一次移动所有精灵,可以将精灵放入全屏evt.getY()并附加使用onTouchEvent()捕捉FrameLayout的精灵GestureDetector 1}}回调,然后在GestureDetector.SimpleOnGestureListener上调用onScroll()。当父scrollTo()滚动时,它的所有子精灵都会一起移动。