Переместите Codename One Components пальцем - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно реализовать сложную функцию с Codename One, которая включает в себя перемещение компонента (например, кнопки) на экране: у пользователей будет несколько кнопок на многоуровневой панели, и они смогут перемещать их, используяПалец.Абстрагируя мою проблему, чтобы сделать ее как можно более общей, это требования:

  • есть несколько кнопок на многоуровневой панели;
  • каждая кнопка имеет начальную позицию, рассчитанную поалгоритм, который должен знать размер экрана;
  • положение каждой кнопки может быть внутри видимой части экрана или вне ее (например, положение x / y может быть отрицательным или большим, чем размер экрана));
  • если пользователь касается только кнопки, его слушатель действия должен быть вызван ...
  • ... вместо этого, если пользователь нажимает кнопку и перемещает палец, продолжая нажиматьна экране мой алгоритм должен получать движение пальца по оси x / y в реальном времени, и он должен иметь возможность обновлять положение всех кнопок при движении пальца.

Это не игра.Здесь я изложил проблему, чтобы адаптировать свои требования к нескольким ситуациям.Как я могу реализовать эти вещи в Codename One?

«Простой» вариант использования, чтобы лучше понять, что я имею в виду, например, перемещение кнопок, расположенных по кругу: в этом примере пользователь может нажатьодна кнопка или он / она может вращать весь круг кнопок, перемещая палец при нажатии кнопки.

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете использовать setDraggable(true) и превратить контейнеры для сбрасывания в мишень для сбрасывания, используя 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);
    }
}
...