如何将拖动的对象与拖动的原点对齐?
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 移动到该点。我希望你已经明白了。
我在开发卡牌游戏时用过这种方法,效果很好。
我有一个 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 移动到该点。我希望你已经明白了。
我在开发卡牌游戏时用过这种方法,效果很好。