將動畫們弄到一起
一個應用通常將包含不止一個動畫。例如,你可能想同時移動多個圖形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();