Java 安卓:限制阻力&;落物
我有一个活动。在这个活动中,我有一个相对的布局。在此布局上,我放置了几个来自扩展RelativeLayout的类的自定义对象。Java 安卓:限制阻力&;落物,java,android,drag-and-drop,motionevent,Java,Android,Drag And Drop,Motionevent,我有一个活动。在这个活动中,我有一个相对的布局。在此布局上,我放置了几个来自扩展RelativeLayout的类的自定义对象。 它看起来有点像棋盘(不是,但你知道我在说什么)。 现在,我希望能够触摸其中一个对象,并将其拖动到4个相邻字段中的一个,与其中一个字段进行交换。 我认为最简单的方法是使用机器人拖放 我对每个对象都使用了setOnTouchListener和setOnDragListener,因此每个对象都可以被触摸并拖动到另一个对象上。 我使用了教程,应该比代码更容易阅读,但它是:
它看起来有点像棋盘(不是,但你知道我在说什么)。
现在,我希望能够触摸其中一个对象,并将其拖动到4个相邻字段中的一个,与其中一个字段进行交换。
我认为最简单的方法是使用机器人拖放 我对每个对象都使用了setOnTouchListener和setOnDragListener,因此每个对象都可以被触摸并拖动到另一个对象上。
我使用了教程,应该比代码更容易阅读,但它是:
@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)在拖放之前移动另一个对象,使其看起来像是在交换对象 编辑: 我得到了方向,因为我可以从onDrag中的
视图.getX
,视图.getY
(坐标在我的startobject中)和v.getX
以及v.getY
(来自我所在对象的坐标)计算方向,当DrageEvent被输入时。现在,我试图找出如何将拖拽阴影的位置设置为我想要的对象,或者只允许沿我的方向拖拽并结束对下一个对象的拖拽。
进一步的帮助或想法仍然值得赞赏。您可以专门化
DragShadowBuilder
并覆盖onDraw方法。我假设Canvas
参数预先配置了转换矩阵
,该转换将视图转换为接触点位置。您可以通过在点F
上应用矩阵来阅读该翻译。如果平移超出边界,您可以将另一个平移连接到画布,使阴影视图保持在边界内……我认为,如果您允许将对象拖到整个游戏板上,麻烦会少一些。如果它是一个无效的字段,你可以用红色突出显示它,或者用大红色X之类的东西改变阴影视图。听起来很有趣。谢谢你的输入,我会考虑它如何适合和发挥一点阴影。现在我想知道拖动的方向,我想应该可以将阴影设置到下一个对象的位置,而不是限制拖动。