用手指移动代号一组件



我需要实现一个代号为One的复杂功能,该功能涉及在屏幕上移动点击的组件(如按钮(:用户将在分层窗格上有一些按钮,他们应该能够使用手指移动它们。抽象我的问题以使其尽可能通用,这些是要求:

  • 分层窗格中有几个按钮;
  • 每个按钮都有一个初始位置,该位置由需要知道屏幕尺寸的算法计算;
  • 每个按钮的位置可以在屏幕的可见部分内或屏幕外(例如,X/Y 位置可以是负数或大于屏幕尺寸(;
  • 如果用户只点击一个按钮,则应调用其操作侦听器...
  • 。相反,如果用户点击按钮并在继续按下屏幕的同时移动手指,我的算法应该实时接收手指的 X/Y 轴移动,并且它应该能够在手指移动时更新所有按钮的位置。

这不是游戏。在这里,我抽象了问题,以使我的要求适应几种情况。如何在代号一中实现这些东西?

为了更好地理解我的意思,一个"简单"的用例是例如移动设置在圆圈中的按钮:在这个例子中,用户可以点击一个按钮,或者他/她可以在点击按钮的同时旋转所有移动手指的按钮圆圈。

您可以使用setDraggable(true)并使用setDropTarget(true)将放置容器转换为可放置的目标。完成此操作后,Container的默认行为将允许您在可放置的容器实例之间直观地重新排列/移动组件。您可以简单地覆盖默认的 drop 方法,Container使用更智能的东西来实现您想要的功能:

public void drop(Component dragged, int x, int y) {
int i = getComponentIndex(dragged);
if(i > -1) {
Component dest = getComponentAt(x, y);
if(dest != dragged) {
int destIndex = getComponentIndex(dest);
if(destIndex > -1 && destIndex != i) {
setComponentIndex(dragged,destIndex);
}
}
animateLayout(400);
} else {
Container oldParent = dragged.getParent();
if(oldParent != null) {
oldParent.removeComponent(dragged);
}
Component pos = getComponentAt(x, y);
i = getComponentIndex(pos);
if(i > -1) {
addComponent(i, dragged);
} else {
addComponent(dragged);
}
getComponentForm().animateHierarchy(400);
}
}

最新更新