Ich versuche, Animationen sequentiell sichtbar zu machen. Ich habe eine JavaScript-Funktion, die myModel.move() zweimal aufruft. Ich habe eine GridView, um myModel zu zeigen und ich habe "Behaviour on x" Animation, so kann ich die Bewegungen sehen. Aber, beide Bewegungs animatons laufen in paralell (die kleine Verzögerung zwischen ihnen ist nicht bemerkbar).QML: warte bis Animationen fertig
Meine Idee war es, einen Zähler hinzuzufügen, wie viele Animationen gestartet wurden und wie viele von ihnen bereits fertig sind. Etwas wie das;
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
}
}
}
}
Dies funktioniert wie erwartet. Dann füge ich meiner JavaScript-Funktion eine Schleife hinzu, um zu warten, bis alle Animationen beendet sind.
ListModel {
id: myModel
property int busy: 0
function doSomething() {
myModel.move(...)
while (myModel.busy) {}
myModel.move(...)
}
}
Hier ist das Problem. Ich kann sehen, dass nach dem ersten Zug() alle notwendigen Animationen gestartet wurden, aber nichts ist zu sehen und keine Animation ist beendet. Ich habe eine Art Deadlock. Wie löst man das?
Ja, ich weiß ... vereinfachte Fragen produzieren vereinfachte Antworten :-(In der Tat, ich mag vielen verschiedenen aufeinanderfolgende myModel.move haben (...) nennt. Allerdings Ihr Vorschlag verwendbar ist (siehe Lösung, die ich unten bekanntgab) – meolic
Eine beschäftigte Schleife ist keine gute Idee, wenn Sie Leistung beibehalten möchten. – trusktr
@trusktr und wo sehen Sie, dass ich sage, dass es eine gute Idee ist? – UmNyobe