Apache flex 在Flex 4中手动拖放,同时避免与其他拖动设备发生碰撞

Apache flex 在Flex 4中手动拖放,同时避免与其他拖动设备发生碰撞,apache-flex,drag-and-drop,flex4,collision-detection,Apache Flex,Drag And Drop,Flex4,Collision Detection,我有一个生成的应用程序,其中一部分是一个练习,用户必须拖动一个或多个项目(主要是文本,但也可以是图像),然后将其放入框中,如下图所示 该框是BorderContainer的自定义子类。 每个可拖动项(RichText的子类)都会在MouseEvent中拾取。使用startDrag()将鼠标向下移动。当它在鼠标向上释放时它会使用this.hitTestObject(box)检查它是否击中盒子,如果没有击中,则会将动画设置回起始位置。如果它真的击中了,我们会的 stopDrag(); this.x

我有一个生成的应用程序,其中一部分是一个练习,用户必须拖动一个或多个项目(主要是文本,但也可以是图像),然后将其放入框中,如下图所示

该框是
BorderContainer
的自定义子类。 每个可拖动项(RichText的子类)都会在
MouseEvent中拾取。使用
startDrag()
将鼠标向下移动
。当它在
鼠标向上释放时
它会使用
this.hitTestObject(box)
检查它是否击中盒子,如果没有击中,则会将动画设置回起始位置。如果它真的击中了,我们会的

stopDrag();
this.x = e.stageX; // e is the MouseEvent
this.y = e.stageY;
效果相当不错。这种方法的问题是,可拖动项可能会相互碰撞,这看起来不太美观

我想防止拖拽物品相互碰撞,同时确保它们放在箱子里

我考虑过用两种方法来解决这个问题:

  • 在框内创建某种网格,确保每个网格正方形足够大,可以包含最大的可拖动项目,并使项目显示在最近的自由网格正方形中

    这样做的问题是,盒子和每个可拖动的项目可以是任意大小,也可以有任意数量的可拖动项目,因此,确保用户可以将每个项目都放入盒子中(如果他愿意的话),并保持其外观正常,这有点麻烦

  • 将每个放置的项目与放置中已经存在的所有其他项目进行检查,如果它们发生碰撞,则将新放置的项目向其中一个方向移动一点,直到它们不再发生碰撞

    这里的问题是把所有东西都放在盒子里,而不是陷入一个试图朝着一个不可能的方向移动的循环中。如果它无法移动怎么办

我是否错过了一些显而易见的方法,或者更简单的方法?如果没有,我如何尽可能简单地实现这一点


有些碰撞可能没问题,因为用户不会花太多时间进行这些练习,但现在的工作方式是,他们几乎似乎在寻找对方,并可怕地崩溃

使用Flex帮助中记录的DragManager。仅将接受代码放在您的BorderContainer上。然后将项目作为BorderContainer的子项,并给它一个您想要的布局。

我最后添加了一个
滚动条
包装在
BorderContainer
中,并将
添加到TileLayout中。然后将拖动的项目添加到
组中
,这会产生一些不错的结果。我不太喜欢滚动条,或者当我拖入或拖出一些东西时,瓷砖有时会调整大小,但我想当我事先不知道大小时,这是很难避免的。