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.

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