將動(dòng)畫們弄到一起
一個(gè)應(yīng)用通常將包含不止一個(gè)動(dòng)畫。例如,你可能想同時(shí)移動(dòng)多個(gè)圖形item也可能順序的一個(gè)接一個(gè)的移動(dòng)。
QanimationGroup 的子類們(QSequentialAnimationGroup和QParallelAnimationGroup)是其它動(dòng)畫的容器,所以這些動(dòng)畫既可 以并行也可以串行。QAnimationGroup是一個(gè)非屬性動(dòng)畫的例子,但是它定期的收到時(shí)間改變的通知。這使得它可以把時(shí)間改變傳輸給所包含的動(dòng)畫 們,從而控制何時(shí)播放那些動(dòng)畫們。
讓我們看一下使用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();
一個(gè)并行g(shù)roup在同一時(shí)刻播放多個(gè)動(dòng)畫。對(duì)start()的調(diào)用將啟動(dòng)它所統(tǒng)治的所有的動(dòng)畫。
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順序的播放它的動(dòng)畫們。它在上一個(gè)完成時(shí)按順序播放下一個(gè)。
既然一個(gè)動(dòng)畫組本就是一個(gè)動(dòng)畫類,你可以把它添加到其它組中。如此,你可以建立起一個(gè)動(dòng)畫樹。
動(dòng)畫和狀態(tài)當(dāng) 使用狀態(tài)機(jī),我們可以使用一個(gè)QSignalTransition或QEventTransition類在狀態(tài)轉(zhuǎn)換時(shí)連接一個(gè)或多個(gè)動(dòng)畫。這些類都是從 QAbstractTransition派生的,它們定義了簡(jiǎn)易的函數(shù)addAnimation(),使得能夠添加一個(gè)或多個(gè)動(dòng)畫,在狀態(tài)轉(zhuǎn)換時(shí)啟動(dòng)這些 動(dòng)畫。
我們還可能連接屬性與狀態(tài),而不是手動(dòng)設(shè)置開始與結(jié)束值。下面是完整的代碼,演示了動(dòng)畫一個(gè)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();