未收到DragListener View.ACTION_DRAG_ENDED

时间:2017-07-02 12:41:58

标签: android drag-and-drop

希望你能帮忙,我会变得大胆。

如果有一个拖放的棋盘游戏。问题是有时拖动已启动但没有收到Drag.ended或其他人的回调。

在rootview上我有一个DragListener,所以我无法弄清楚拖动是如何开始的,没有用于drag.Ended的回调?

我还把这个拖拉机放在了主板上的所有个人字段上。

dragListener = new DragListener();
binding.getRoot().setOnDragListener(dragListener);


private class DragListener implements View.OnDragListener {

    boolean moveReverted;

    @Override
    public boolean onDrag(View v, DragEvent event) {
        switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                moveReverted = false;
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                if (v instanceof PieceHolder)
                    ((PieceHolder) v).setIsHighlighted(true);
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                if (v instanceof PieceHolder)
                    ((PieceHolder) v).setIsHighlighted(false);
                break;
            case DragEvent.ACTION_DROP:
                Timber.d("Action dropped: %s", event.getAction());

                if (!(v instanceof PieceHolder)) {
                    return false;
                }

                PieceHolder pieceHolderTo = (PieceHolder) v;
                pieceHolderTo.setIsHighlighted(false);

                Move move = ((PieceHolder) event.getLocalState()).getMove();
                move.to = pieceHolderTo.getPosition();

                if (pieceHolderTo.hasPiece() || !checkAndCalculatePoints(move)) {
                    return false;
                }

                pieceHolderTo.setPiece(move.piece);

                break;
            case DragEvent.ACTION_DRAG_ENDED:
                if (!event.getResult() && !moveReverted) {
                    moveReverted = true;
                    revertDrag(((PieceHolder) event.getLocalState()).getMove());
                }
            default:
                break;
        }
        return true;
    }

1 个答案:

答案 0 :(得分:0)

所以我发现了自己的原因。 虽然startDrag被调用,但实际上已经开始拖动了。 原因是我的GestureDetection之间的时间称为 - >的startDrag() 它太短了以至于它实际上没有执行拖动过程,因此startDrag()返回false。

所以解决方案是(太简单了):

之前:

  startDrag(null, new ImageDragShadowBuilder(pieceView), this, 0)
  Timber.d("Dragging started");
  refreshView();

解决方案:

  if (startDrag(null, new ImageDragShadowBuilder(pieceView), this, 0)) {
  Timber.d("Dragging started");
  refreshView();
  }