4

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

この行で使用する SwipeView の現在の「x」位置またはスワイプ オフセットにアクセスする方法はありますか。

x: -list.contentX / 2?

これまでに見つけた最も近いものは ですx: -swipeView.contentData[0].x / 2が、スムーズな移行ではなく、アイテムを飛び越える原因となります。

4

1 に答える 1

3

ListView項目の位置は によって管理されるため、水平方向の項目の x 座標を制御することはできませんListView。最初の例でアイテムの位置を操作できる理由は、実際にはデリゲートの位置を操作しているのではなく、デリゲートにラップされた別のアイテムを操作しているためですLoader

ページの場合、同様のラッパーを使用したくない場合は、 QML タイプSwipeViewを使用して変換を適用できます。の internalとそのviaにTranslateアクセスできます。望ましい視差効果の計算は、読者の課題として残されています。:)SwipeViewListViewcontentXSwipeView.contentItem

PS。https://doc.qt.io/qt-5/qtquick-views-example.htmlParallaxViewの例も参照してください。

于 2016-10-29T19:53:44.630 に答える