我试图按顺序制作可见的动画.我有一个javascript函数,它调用myModel.move()两次.我有一个GridView来显示myModel,我有"行为在x"动画,因此我可以看到动作.但是,两个运动动画师都是并列的(他们之间的小延迟并不明显).
我的想法是添加一个计数器,显示已启动的动画数量以及已完成的动画数量.像这样的东西;
Behavior on x {
NumberAnimation {
id: animationX;
duration: 500;
onRunningChanged: {
if (animationX.running) {
console.log("Animation start");
myModel.busy = myModel.busy + 1
} else {
console.log("Animation stop");
myModel.busy = myModel.busy - 1
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作.然后,我在我的javascript函数中添加一个循环,等待所有动画完成.
ListModel {
id: myModel
property int busy: 0
function doSomething() {
myModel.move(...)
while (myModel.busy) {}
myModel.move(...)
}
}
Run Code Online (Sandbox Code Playgroud)
这是问题所在.我可以看到,在第一次移动()后,所有必要的动画都开始了,但没有任何东西可以看到,也没有动画完成.我有某种僵局.怎么解决这个?
这是一个基于#UmNyobe 答案的可行解决方案。嗯,QML 是一种声明性语言,因此对于迭代问题来说是有问题的。欢迎任何评论。也许,有人可以建议更好(更具可读性)的纯 QML 程序,它会产生相同的效果。
import QtQuick 1.1
GridView {
id: mainGrid
cellWidth: 165; cellHeight: 95
width: 5*cellWidth; height: 4*cellHeight
model: myModel
delegate: myButton
property string animate: "no"
property int busy: 0
signal busyPlus
signal busyMinus
onBusyPlus: {
busy++
}
onBusyMinus: {
busy--
if (busy == 0) mainGrid.model.algorithm()
}
ListModel {
id: myModel
property int step: 0
property int one: 0
function createModel() {
for (var i=1; i<=20; i++) {
append({"display": i})
}
}
function algorithm() {
if (step == 0) {
move(0,19,1)
one = 0
step++
}
else if (step == 1) {
if (one < 19) {
move(one,one+1,1)
one++
if (one == 19) step++
}
}
else if (step == 2) {
move(0,1,1)
move(5,6,1)
move(10,11,1)
move(15,16,1)
step++
}
}
Component.onCompleted: {
createModel()
mainGrid.animate = "yes"
algorithm()
}
}
Component {
id: myButton
Item {
id: item
width: mainGrid.cellWidth-5; height: mainGrid.cellHeight-5;
Rectangle {
id: box
parent: mainGrid
x: item.x; y: item.y;
width: item.width; height: item.height;
border.width: 1
Text {
anchors.centerIn: parent
text: display
font.pixelSize: 48
}
Behavior on x {
enabled: mainGrid.animate == "yes"
NumberAnimation {
id: animationX;
duration: 1000;
onRunningChanged: {
if (animationX.running) mainGrid.busyPlus()
else mainGrid.busyMinus()
}
}
}
Behavior on y {
enabled: mainGrid.animate == "yes"
NumberAnimation {
id: animationY;
duration: 1000;
onRunningChanged: {
if (animationY.running) mainGrid.busyPlus()
else mainGrid.busyMinus()
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)