Жесты смахивания с помощью QML Stackview

Таким образом, QML StackView предоставляет способ вернуться назад с помощью функции pop(). Я ищу способ перейти на предыдущую страницу, просто проведя пальцем вправо с элементами пользовательского интерфейса, следуя пальцам пользователя (вроде SwipeView). Как я могу этого добиться? Я осмотрелся, и все, что я нашел, это https://github.com/alejoasotelo/SwipePageStackWindow, который — это старый проект, который делает то же самое со старым PageStack.


person reckless    schedule 26.05.2018    source источник
comment
Вы можете попробовать использовать для этого SwipeView. Добавьте пустую страницу в качестве второй страницы, а когда индекс изменится, вставьте ее. В противном случае сделайте страницу перетаскиваемой (с MouseArea) и реализуйте пролистывание и определение точки невозврата, скорость и анимацию самостоятельно.   -  person derM    schedule 28.05.2018
comment
@derM Я думаю, что SwipeView на самом деле не альтернатива, поскольку мои приложения будут содержать не менее 20 слоев страниц, поэтому я буду вручную создавать и уничтожать элементы, чтобы избежать проблем с производительностью. Я думал об использовании MouseArea и реализовать этот жест самостоятельно, но я хочу, чтобы предыдущая страница скользила слева, когда пользователь проводит пальцем по текущему элементу вправо. Я не понимаю, как можно заставить предыдущую страницу сделать это. Предоставляет ли StackView способ сделать это?   -  person reckless    schedule 28.05.2018
comment
Если ваша единственная проблема с использованием SwipeView вместо StackView связана с производительностью/памятью, есть пример того, как загружать только три элемента одновременно. Вы также можете попробовать создать индивидуальную версию SwipeView, которая автоматически заключает добавленные Item в соответствующие Loader.   -  person derM    schedule 28.05.2018
comment
Кроме того, с StackView у вас уже есть ручное управление временем жизни ваших элементов — они живут от push до pop   -  person derM    schedule 28.05.2018
comment
Да, я понимаю, что в принципе это выполнимо, но мне пришлось бы воссоздать все функции StackView в пользовательском SwipeView, а также потерять возможность настраивать переходы при переключении между страницами (полагаю, я мог бы попытаться как-то воссоздать и это тоже) . Это потребует довольно много усилий, и я бы предпочел оставить этот вариант в крайнем случае. Я считаю, что StackView действительно идеален, но единственное, чего мне не хватает, — это возможности использовать жесты смахивания так, как я описал выше.   -  person reckless    schedule 28.05.2018
comment
Что ж, моя первоначальная идея была такой: поместить SwipeView с двумя элементами на StackView. Первый Item — это реальный контент, второй — пустой Item. Затем соедините indexChanged SwipeView с pop(). Это позволит вам получить красивый и плавный эффект смахивания, который мне было трудно создать другим способом. С другой стороны, оф. это взлом.   -  person derM    schedule 28.05.2018
comment
Это похоже на идею, которая может сработать. Не могли бы вы немного распаковать это для меня? Вы хотите сказать, что я должен создать SwipeView внутри StackView? Вот так: StackView{ id: stack SwipeView{ ..... } }   -  person reckless    schedule 28.05.2018


Ответы (1)


Один из возможных способов сделать это — создать настраиваемый элемент с именем swiper, у которого есть swipeview с 3 страницами. 1 и 3 пусты, но 2 имеет содержимое. Когда страница 1 активна, она позволяет проходить всем событиям, если не обнаружено смахивание влево. Страница 2 имеет загрузчик, поэтому вы можете изменить содержимое.

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

Итак, у вас будет переменная isBottomActive

И одна функция метода pushNewView(view) ‹- это переместит любой неактивный swiper на передний план, поместит представление в его загрузчик и изменит currentIndex на 2.

Теперь, если вам нужно вернуться назад, просто проведите пальцем вправо. Индекс представления swiper изменяется (здесь вы можете связать метод, чтобы старый swipeview перемещался обратно вниз с другим представлением)

person Parthanon    schedule 02.06.2020