Перетащите виджет PlayN/Tripleplay без пересчета макета

Мне нравится макет пользовательского интерфейса Tripleplay для платформы PlayN, но могу ли я иногда отключить расчет макета, чтобы я мог перемещать объекты или изменять текст виджета без запуска расчета макета?

Например, я создал простой экран с одной кнопкой в AxisLayoutи добавил слушателя к кнопке:

button.layer.addListener(new Adapter() {
    private float startX;

    @Override
    public void onPointerStart(Event event) {
        startX = event.localX();
    }

    @Override
    public void onPointerDrag(Event event) {
        button.layer.transform().translateX(event.localX() - startX);
    }
});

Теперь перетаскивание кнопки перемещает ее влево и вправо, и я счастлив. Вы можете увидеть исходный код на Github.

Однако этот код имеет две проблемы:

  1. Когда я отпускаю мышь или поднимаю палец, кнопка возвращается в исходное положение.
  2. Если я потяну мышь или палец вверх, чтобы он оставил кнопку, кнопка ненадолго вернется в исходное положение, а затем продолжит перетаскивание. Если я отпущу мышь или подниму палец в этом состоянии, когда она находится за пределами кнопки, кнопка остается там, где она есть.

Кажется, что происходит то, что всякий раз, когда кнопка меняет состояние с нажатой на не нажатую или иным образом, компоновка экрана пересчитывается, и кнопка возвращается в исходное положение.

Есть ли способ сказать экрану не пересчитать его расположение? Могу ли я сказать кнопке, что она действительна?

Единственная стратегия, которую я могу придумать, - это поместить кнопку в макет оси, вычислить ее положение, а затем переместить ее из макета оси в абсолютный макет, пока я перемещаю его. Я надеюсь, что есть более простой способ.

1 ответ

Решение

Идея элементов tripleplay заключается в том, что они позиционируют себя на основе макетов, ограничений, размера и т. Д. И т. Д.

Если вы хотите иметь возможность перемещать их, вам нужно использовать AbsoluteLayout

Другие вопросы по тегам