Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓:限制阻力&;落物_Java_Android_Drag And Drop_Motionevent - Fatal编程技术网

Java 安卓:限制阻力&;落物

Java 安卓:限制阻力&;落物,java,android,drag-and-drop,motionevent,Java,Android,Drag And Drop,Motionevent,我有一个活动。在这个活动中,我有一个相对的布局。在此布局上,我放置了几个来自扩展RelativeLayout的类的自定义对象。 它看起来有点像棋盘(不是,但你知道我在说什么)。 现在,我希望能够触摸其中一个对象,并将其拖动到4个相邻字段中的一个,与其中一个字段进行交换。 我认为最简单的方法是使用机器人拖放 我对每个对象都使用了setOnTouchListener和setOnDragListener,因此每个对象都可以被触摸并拖动到另一个对象上。 我使用了教程,应该比代码更容易阅读,但它是:

我有一个活动。在这个活动中,我有一个相对的布局。在此布局上,我放置了几个来自扩展RelativeLayout的类的自定义对象。
它看起来有点像棋盘(不是,但你知道我在说什么)。
现在,我希望能够触摸其中一个对象,并将其拖动到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之类的东西改变阴影视图。听起来很有趣。谢谢你的输入,我会考虑它如何适合和发挥一点阴影。现在我想知道拖动的方向,我想应该可以将阴影设置到下一个对象的位置,而不是限制拖动。