如何将拖动的对象与拖动的原点对齐?

How to align dragged object to origin of drag?

我有一个 LinearLayout,里面有五个视图,它们形成一个 1x5 的网格。

此 LinearLayout 将被拖动。

我目前正在对五个视图中的每一个设置 onTouchListeners,检查拖动来自五个视图中的哪一个,并在 LinearLayout 上调用 motionEvent.getAction()。

这是不完美的,因为 LinearLayout 是通过它的中心拖动的,而不是通过拖动开始点拖动的。

有没有什么方法可以在 motionEvent 开始时转换 LinearLayout,以便在拖动时拖动起源的 View 位于手指下方?

在 LinearLayout 中的五个视图中的每一个上设置的 MyTouchListener

    private final class MyTouchListener implements View.OnTouchListener {
    //public boolean onTouch(View view, MotionEvent motionEvent) {
    public boolean onTouch(View view, MotionEvent motionEvent) {
        LinearLayout ship = (LinearLayout)view.getParent();
        dragCellIndex = ship.indexOfChild(view);
        dragCellTotal = ship.getChildCount();
        view = ship;

        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {            
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            view.setVisibility(View.INVISIBLE);
            return true;
        } else {
            return false;
        }
    }
}

为此,您需要进行一些数学计算。从 motionEvent 中获取手指的触摸/拖动点 X 和 Y 坐标,计算它们与 LinearLayout 左上角的 X 和 Y 坐标的差值,并将它们保存在 2 个变量中。

这样,当您拖动 LinearLayout 时,您只需将这些变量添加到 X 和 Y 坐标并将 LinearLayout 移动到该点。我希望你已经明白了。

我在开发卡牌游戏时用过这种方法,效果很好。