我试图在每次点击时启动QML动画,而不使用状态。它在第一次点击时启动,但在第二次点击时就不会启动。 有原因吗?这是我正在使用的代码。
Image {
id: head;
source: "vlad.png";
height: 80;
width: 90;
MouseArea {
anchors.fill: parent
onClicked: animateHead.start();
ParallelAnimation {
id: animateHead;
NumberAnimation {
property int randomValueX: 0;
function randomize(randomValueX) {
randomValueX = (Math.floor(Math.random()*210));
return randomValueX;
}
target: head;
properties: "x";
to: randomize(randomValueX);
duration: 1000;
easing {
type: Easing.OutBack;
overshoot: 5
}
}
NumberAnimation {
property int randomValueY: 0;
function randomize(randomValueY) {
randomValueY = (Math.floor(Math.random()*210));
return randomValueY;
}
target: head;
properties: "y";
to: randomize(randomValueY);
duration: 700;
easing {
type: Easing.OutBack;
overshoot: 5
}
}
}
}
}
答案 0 :(得分:3)
问题是两个to
实例的NumberAnimation
属性的值在QML组件初始化期间仅绑定一次。调用animateHead.start()
时不会重新计算它们,只有to
属性的值与动画属性的实际值不同时才会执行动画。这就是它第一次运作的原因。
一个有效的解决方案是:
import QtQuick 1.0
Image {
id: head;
source: "vlad.png";
height: 80;
width: 90;
MouseArea {
anchors.fill: parent
onClicked: {
xAnimation.to = Math.floor(Math.random()*210)
yAnimation.to = Math.floor(Math.random()*210)
animateHead.start();
}
ParallelAnimation {
id: animateHead;
NumberAnimation {
id: xAnimation
target: head;
properties: "x";
duration: 1000;
easing {
type: Easing.OutBack;
overshoot: 5
}
}
NumberAnimation {
id: yAnimation
target: head;
properties: "y";
duration: 1000;
easing {
type: Easing.OutBack;
overshoot: 5
}
}
}
}
}
此处to
属性的值在onClicked
的{{1}}处理程序中明确设置。
答案 1 :(得分:0)
正如笔记一样,因为我试图解决类似的问题,搜索了这个问题并决定必须有另一种处理动画属性初始化的方法。在 Qt 5 中,您可以使用PropertyAction
立即初始化某些属性。
来自PropertyAction
类型文档的示例:
SequentialAnimation {
PropertyAction { target: img; property: "opacity"; value: .5 }
NumberAnimation { target: img; property: "width"; to: 300; duration: 1000 }
PropertyAction { target: img; property: "opacity"; value: 1 }
}
我不知道它会如何与ParallelAnimation
互动,但它与SequentialAnimation
的效果非常好。