QML: положение элемента в середине прокрутки в SwipeView
Я пытаюсь создать Parallax View на основе элемента SwipeView. Примеры в документации QML иллюстрируют, как этого добиться с помощью ListView:
Image {
id: background
source: "background.png"
fillMode: Image.TileHorizontally
x: -list.contentX / 2
width: Math.max(list.contentWidth, parent.width)
}
ListView {
id: list
anchors.fill: parent
spacing: 20
snapMode: ListView.SnapToItem
orientation: ListView.Horizontal
highlightRangeMode: ListView.StrictlyEnforceRange
boundsBehavior: Flickable.StopAtBounds
maximumFlickVelocity: 1000
model: _some_cpp_list
//Loader is used as a workaround for QTBUG-49224
delegate: Loader {
id: loaderDelegate
source: "MyDelegate.qml"
width: myScreen.width
height: myScreen.height
onLoaded: {
loaderDelegate.item.logic = modelData
}
}
}
Теперь это работает, но вместо ListView я хочу использовать SwipeView, так как для достижения желаемого поведения требуется меньше кода:
SwipeView {
id: list
anchors.fill: parent
spacing: 20
Repeater {
model: _some_cpp_list
delegate: MyDelegate {
logic: modelData
}
}
Есть ли способ, которым я мог бы получить доступ к текущей позиции "x" SwipeView или смещения прокрутки, чтобы использовать в этой строке:
x: -list.contentX / 2
?
Самое близкое, что я нашел, это x: -swipeView.contentData[0].x / 2
, но это вызывает перепрыгивание предметов, а не плавный переход.
1 ответ
Вы не можете контролировать X-координаты предметов в горизонтальной плоскости ListView
потому что позиции позиции управляются ListView
, Причина, по которой вы можете манипулировать позициями элементов в вашем первом примере, заключается в том, что вы фактически не манипулируете позицией делегата, а другим элементом, заключенным в Loader
делегировать.
За SwipeView
страниц, если вы не хотите использовать аналогичные оболочки, вы можете применить преобразование, используя Translate
Тип QML. Вы можете получить доступ SwipeView
внутренний ListView
И его contentX
с помощью SwipeView.contentItem
, Расчет желаемого эффекта параллакса оставлен читателю в качестве упражнения.:)
PS. Смотрите также ParallaxView
пример на https://doc.qt.io/qt-5/qtquick-views-example.html.