首页 > 解决方案 > 用手指移动代号一组件

问题描述

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

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

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

标签: codenameone

解决方案


您可以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);
    }
}

推荐阅读