【问题标题】:Dragging objects using ACTION_MOVE使用 ACTION_MOVE 拖动对象
【发布时间】:2014-03-06 07:32:31
【问题描述】:

我正在尝试使我绘制的所有 Sprite 都可拖动以用于一个小游戏。它应该能够触摸任何地方,并且精灵应该移动相同的距离,手指移动。

使用以下方法,它们将在 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;
}

对此有什么想法吗?

【问题讨论】:

    标签: android motionevent


    【解决方案1】:

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

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


    每条评论更新

    如果你想一次移动所有的精灵,你可以把精灵放到一个全屏FrameLayout并附加一个GestureDetector,它使用GestureDetector.SimpleOnGestureListener来捕获onScroll()回调然后调用@ 987654339@FrameLayout。当父 FrameLayout 滚动时,其所有子 sprite 将出现一起移动。

    【讨论】:

    • 问题是,我希望所有精灵只需拖动 1 次即可移动以实现滚动效果。对不起,如果我弄错了,但我对此有点陌生。
    • @guennin 啊哈。所以有一个简单的技巧可以做到这一点。我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多