codenameone - 用手指移动代号一组件
问题描述
我需要使用 Codename One 实现一个复杂的功能,该功能涉及在屏幕上移动被点击的组件(如按钮):用户将在分层窗格上有一些按钮,他们应该能够使用手指移动它们。抽象我的问题以使其尽可能普遍,这些是要求:
- 分层窗格中有几个按钮;
- 每个按钮都有一个需要知道屏幕大小的算法计算出的初始位置;
- 每个按钮的位置可以在屏幕的可见部分之内或之外(例如,x/y 位置可以是负数或大于屏幕尺寸);
- 如果用户只点击一个按钮,它的动作监听器应该被调用......
- ...相反,如果用户在继续按下屏幕的同时点击按钮并移动手指,我的算法应该实时接收手指的 x/y 轴移动,并且应该能够更新所有按钮的位置在手指移动的同时。
这不是游戏。在这里,我对问题进行了抽象,以使我的要求适应几种情况。我怎样才能在代号一中实现这些东西?
为了更好地理解我的意思,一个“简单”的用例是例如移动放置在一个圆圈中的按钮:在这个例子中,用户可以点击一个按钮,或者他/她可以旋转所有的按钮圈来移动手指同时点击按钮。
解决方案
您可以setDraggable(true)
使用setDropTarget(true)
. 一旦你这样做了,默认行为Container
将允许你在可放置的 Container 实例之间重新排列/移动组件。Container
您可以简单地使用实现所需功能的更智能的方法覆盖默认的 drop 方法:
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);
}
}
推荐阅读
- hashicorp-vault - 无法初始化保管库
- javascript - 在 react redux 中唯一地计算某些元素
- php - 无法在我的 formType 中加载 TranslatorInterface
- linux - 查找超过 7 天且在文件名的第三个字符中包含单词“t”的文件
- javascript - 现在将 localhost 上传到在线版本。它不起作用
- google-apps-script - 如何在脚本上安排触发器
- coldfusion - 使用 CFEXECUTE 执行批处理文件
- python - Python Curve_Fit 指数/幂/对数曲线 - 改善结果
- python - 需要输入:路线难度的线性回归预测相当糟糕
- apache-spark - 如何让pyspark在emr集群上运行代码