希望你能帮忙,我会变得大胆。
如果有一个拖放的棋盘游戏。问题是有时拖动已启动但没有收到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;
}
答案 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();
}