Перетащите виджет 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 ответ
Идея элементов tripleplay заключается в том, что они позиционируют себя на основе макетов, ограничений, размера и т. Д. И т. Д.
Если вы хотите иметь возможность перемещать их, вам нужно использовать AbsoluteLayout