QML 中未触发位移的 ViewTransition
Displaced ViewTransition not triggered in QML
所以我有一个 ListView 和 ListModel,我正在向其中动态添加对象。我希望在添加新对象时发生 displaced
动画,但据我所知,仅触发了 add
过渡,而从未触发 displaced
过渡。根据教程,这有效:
Rectangle {
anchors.fill: parent
ListView {
width: 240; height: 320
model: ListModel {
id: model
}
Component {
id: del
Row {
height: 20
spacing: 20
Text { text: name }
Text { text: age }
}
}
delegate: del
add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 1000 }
}
displaced: Transition {
NumberAnimation { properties: "x,y"; duration: 1000; easing.type: Easing.OutBounce }
}
focus: true
Keys.onSpacePressed: model.insert(0, { "name": "Item " + model.count, "age":21})
}
}
但这只会触发 add
转换。
Rectangle {
height: 500
width: 0.90 * parent.width
anchors {
top: parent
topMargin: 30
left: parent.left
leftMargin: 45
}
ListView {
anchors.fill: parent
model: notificationModel
delegate: notificationDelegate
spacing: 30
add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 1000 }
}
displaced: Transition {
NumberAnimation { properties: "x,y"; duration: 1000; easing.type: Easing.OutBounce }
}
}
}
ListModel {
id: notificationModel
Component.onCompleted: {
notificationModel.append({"name": "Tony"})
}
}
Timer {
interval: 5000; running: true; repeat: true
onTriggered: notificationModel.append({"name": "Stark"})
}
Component {
id: notificationDelegate
Row {
spacing: 20
Text { text: name; color: "white" }
}
}
知道为什么会这样吗?谢谢!
当列表中的一个项目因为另一个项目 added/removed/etc 而被迫移动时,会触发 displaced
转换。工作示例之所以有效,是因为在列表的开头插入了一个项目,导致剩余项目被替换。
对于您显示的当前代码,问题在于您使用的是 append
函数而不是 insert
。 Append 将项目添加到列表的底部,因此没有项目被取代。
在您编辑问题之前,您遇到了一个不同的问题。您使用 insert
将项目添加到列表的开头,但每次添加一个项目时,您都会清除整个列表并重建它。再说一次,没有任何东西被取代,因为每次都会重新创建整个列表。
所以我有一个 ListView 和 ListModel,我正在向其中动态添加对象。我希望在添加新对象时发生 displaced
动画,但据我所知,仅触发了 add
过渡,而从未触发 displaced
过渡。根据教程,这有效:
Rectangle {
anchors.fill: parent
ListView {
width: 240; height: 320
model: ListModel {
id: model
}
Component {
id: del
Row {
height: 20
spacing: 20
Text { text: name }
Text { text: age }
}
}
delegate: del
add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 1000 }
}
displaced: Transition {
NumberAnimation { properties: "x,y"; duration: 1000; easing.type: Easing.OutBounce }
}
focus: true
Keys.onSpacePressed: model.insert(0, { "name": "Item " + model.count, "age":21})
}
}
但这只会触发 add
转换。
Rectangle {
height: 500
width: 0.90 * parent.width
anchors {
top: parent
topMargin: 30
left: parent.left
leftMargin: 45
}
ListView {
anchors.fill: parent
model: notificationModel
delegate: notificationDelegate
spacing: 30
add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 1000 }
}
displaced: Transition {
NumberAnimation { properties: "x,y"; duration: 1000; easing.type: Easing.OutBounce }
}
}
}
ListModel {
id: notificationModel
Component.onCompleted: {
notificationModel.append({"name": "Tony"})
}
}
Timer {
interval: 5000; running: true; repeat: true
onTriggered: notificationModel.append({"name": "Stark"})
}
Component {
id: notificationDelegate
Row {
spacing: 20
Text { text: name; color: "white" }
}
}
知道为什么会这样吗?谢谢!
当列表中的一个项目因为另一个项目 added/removed/etc 而被迫移动时,会触发 displaced
转换。工作示例之所以有效,是因为在列表的开头插入了一个项目,导致剩余项目被替换。
对于您显示的当前代码,问题在于您使用的是 append
函数而不是 insert
。 Append 将项目添加到列表的底部,因此没有项目被取代。
在您编辑问题之前,您遇到了一个不同的问题。您使用 insert
将项目添加到列表的开头,但每次添加一个项目时,您都会清除整个列表并重建它。再说一次,没有任何东西被取代,因为每次都会重新创建整个列表。