用手指移动代号一个组件

时间:2018-09-16 21:52:53

标签: codenameone

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

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

这不是游戏。在这里,我对问题进行了抽象,以使我的要求适应多种情况。如何在Codename One中实现这些功能?

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

1 个答案:

答案 0 :(得分:1)

您可以使用setDropTarget(true),并使用Container将放置容器变成可放置的目标。完成此操作后,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); } } 中的默认drop方法:

requirements.txt