2016-10-27 3 views
3

Я пытаюсь создать представление Parallax на основе элемента SwipeView. Примеры в QML документации показано, как достичь его с ListView:QML: Позиция элемента в SwipeView с серединой резкости

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 
     } 
    } 

есть ли способ, я мог бы получить доступ к текущей позиции SwipeView в «х» или проведите пальцем по экрану смещения для использования в этой строке:

x: -list.contentX/2?

Ближайшим, который я нашел до сих пор, является x: -swipeView.contentData[0].x/2, но он вызывает прыжки через предметы, а не плавный переход.

+2

Вы не можете управлять x-координатой элементов в горизонтальном ListView, поскольку позиции позиций управляются ListView. Причина, по которой вы можете манипулировать позициями позиции в первом примере, заключается в том, что вы фактически не манипулируете позицией делегата, а другой элемент, заключенный в делегат Loader. Для страниц SwipeView, если вы не хотите использовать похожие обертки, вы можете применить преобразование с помощью QML Translate. Вы можете получить доступ к внутреннему списку ListView SwipeView и его содержимомуX через SwipeView.contentItem. – jpnurmi

+2

Я не знаю, сколько это поможет, но также проверьте пример ParallaxView по адресу http://doc.qt.io/qt-5/qtquick-views-example.html – jpnurmi

+0

@jpnurmi Geez ... это слишком приятно комментарий, чтобы просто быть комментарием. : D Давай, позвольте мне поддержать это! – BaCaRoZzo

ответ

2

Вы не можете управлять координатой x элементов в горизонтальной плоскости ListView, поскольку позиции позиций управляются ListView. Причина, по которой вы можете манипулировать позициями позиции в первом примере, заключается в том, что вы фактически не манипулируете позицией делегата, а другой элемент, завернутый в делегат Loader.

Для страниц SwipeView, если вы не хотите использовать похожие обертки, вы можете применить преобразование, используя QML-тип Translate. Вы можете получить доступ к SwipeView внутренним ListView и его contentX через SwipeView.contentItem. Вычисление желаемого эффекта параллакса оставляется как упражнение для читателя. :)

PS. См. Также пример ParallaxView по адресу https://doc.qt.io/qt-5/qtquick-views-example.html.

Смежные вопросы