我有一个活动。在这个活动上,我有一个相对布局。在这个布局上,我从一个扩展RelativeLayout的类中放置了几个自定义对象 它有点像棋盘(它不是,但所以你知道我在说什么) 我现在希望能够触摸其中一个对象并将其拖动到4个相邻字段中的一个,将其与那个字段交换。 我认为最简单的方法是使用androids drag&下降。
我为每个对象使用了setOnTouchListener和setOnDragListener,因此可以触摸每个对象并将其拖动到另一个对象上。
我使用this教程,应该比阅读代码更容易阅读,但这里是:
@Override
public boolean onTouch(View v, MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
v.startDrag(null, shadowBuilder, v, 0);
return true;
} else {
return false;
}
}
@Override
public boolean onDrag(View v, DragEvent e) {
if (e.getAction()==DragEvent.ACTION_DROP) {
View view = (View) e.getLocalState();
ViewGroup from = (ViewGroup) view.getParent();
from.removeView(view);
MyCustomViewClass to = (MyCustomViewClass) v;
to.addView(view);
view.setVisibility(View.VISIBLE);
}
return true;
}
现在我想知道如何限制物体掉落的位置。我希望它能够被移动到4个相邻的字段(不仅通过限制draglistener,我也不希望对象移动到这个对象之外,无论手指试图拖动多远)。
我希望你明白我的意思,如果不是,请问
所以这个问题就是我可以用这个拖拽和放大器做些什么。我猜。是否有可能以某种方式检测手指在下降之前的位置?是否可以将拖动限制为直线x和y轴?或者有没有办法知道拖动运动的方向,允许我1)知道我要交换的对象和2)在放置之前移动另一个对象,使它看起来像对象只是交换?
修改
我得到了方向,因为我可以从view.getX
计算出来,view.getY
(坐标在我的开始对象中)和v.getX
和v.getY
(来自对象的坐标我已经结束了) )当dragEvent为ACTION_ENTERED时,在onDrag中
现在我试着弄清楚如何将dragshadows位置设置为我希望它结束的对象,或者只允许在我的方向上拖动并结束对下一个对象的拖动。
进一步的帮助或想法仍然赞赏。