将动画们弄到一起
一个应用通常将包含不止一个动画。例如,你可能想同时移动多个图形item也可能顺序的一个接一个的移动。
QanimationGroup 的子类们(QSequentialAnimationGroup和QParallelAnimationGroup)是其它动画的容器,所以这些动画既可 以并行也可以串行。QAnimationGroup是一个非属性动画的例子,但是它定期的收到时间改变的通知。这使得它可以把时间改变传输给所包含的动画 们,从而控制何时播放那些动画们。
让我们看一下使用QSequentialAnimatoinGroup和QParallelAnimationGroup的代码示例。
QPushButton *bonnie = new QPushButton("Bonnie");
bonnie->show();
QPushButton *clyde = new QPushButton("Clyde");
clyde->show();
QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "geometry");
// Set up anim1
QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "geometry");
// Set up anim2
QParallelAnimationGroup *group = new QParallelAnimationGroup;
group->addAnimation(anim1);
group->addAnimation(anim2);
group->start();
一个并行group在同一时刻播放多个动画。对start()的调用将启动它所统治的所有的动画。
QPushButton button("Animated Button");
button.show();
QPropertyAnimation anim1(&button, "geometry");
anim1.setDuration(3000);
anim1.setStartValue(QRect(0, 0, 100, 30));
anim1.setEndValue(QRect(500, 500, 100, 30));
QPropertyAnimation anim2(&button, "geometry");
anim2.setDuration(3000);
anim2.setStartValue(QRect(500, 500, 100, 30));
anim2.setEndValue(QRect(1000, 500, 100, 30));
QSequentialAnimationGroup group;
group.addAnimation(&anim1);
group.addAnimation(&anim2);
group.start();
QsequentialAnimationGroup顺序的播放它的动画们。它在上一个完成时按顺序播放下一个。
既然一个动画组本就是一个动画类,你可以把它添加到其它组中。如此,你可以建立起一个动画树。
动画和状态当 使用状态机,我们可以使用一个QSignalTransition或QEventTransition类在状态转换时连接一个或多个动画。这些类都是从 QAbstractTransition派生的,它们定义了简易的函数addAnimation(),使得能够添加一个或多个动画,在状态转换时启动这些 动画。
我们还可能连接属性与状态,而不是手动设置开始与结束值。下面是完整的代码,演示了动画一个QPushButton的geometry属性。
QPushButton *button = new QPushButton("Animated Button");
button->show();
QStateMachine *machine = new QStateMachine;
QState *state1 = new QState(machine);
state1->assignProperty(button, "geometry", QRect(0, 0, 100, 30));
machine->setInitialState(state1);
QState *state2 = new QState(machine);
state2->assignProperty(button, "geometry", QRect(250, 250, 100, 30));
QSignalTransition *transition1 = state1->addTransition(button,
SIGNAL(clicked()), state2);
transition1->addAnimation(new QPropertyAnimation(button, "geometry"));
QSignalTransition *transition2 = state2->addTransition(button,
SIGNAL(clicked()), state1);
transition2->addAnimation(new QPropertyAnimation(button, "geometry"));
machine->start();