Qt動畫框架The Animation Framework


動畫框架是Kinetic(運動)項目的一部分,它的目標是提供一中簡單的方法創建動畫的和流暢的GUI。借助Qt動畫屬性,可以提供非常自由的動畫窗體組件和其他對象(QObjects)。動畫框架也能被用於圖形視圖框架。
        一下概述解釋動畫框架體系結構的基礎部分。示例展示了QObject和圖形項(graphics items)顯示動畫中使用的絕大多數基本動畫技術。

The Animation Architecture
Classes in the Animation Framework
Animating Qt Properties
Animations and the Graphics View Framework
Easing Curves
Putting Animations Together
Animations and States
動畫體系結構
          本部分從較高層次介紹動畫框架的結構和對Qt動畫屬性的使用。下圖顯示了動畫框架中大部分重要的類。

 


動畫框架的基礎由基類QAbstractAnimation組成,它有兩個子類QVariantAnimation 和QAnimationGroup。QAbstractAnimation是其他所有類的父類。它提供了基礎的屬性,適用於所有的本框架下的動畫;notably、開始能力、停止、中止一個動畫。它也接受時間改變notifications。
此外動畫框架提供了 QPropertyAnimation類,它繼承自QVariantAnimation,實現了一個Qt動畫屬性。它是Qt的meta-object system的一部分。QPropertyAnimation通過屬性使用一個釋放曲線(easing curve)執行一個槽。所以當你想讓某一個值動起來,你可以聲明這個值作為一個屬性,並且創建一個QObject類。
可以構建一個QAbstractAnimations樹來表現復雜的動畫。樹由QAnimationGroup來實現,它的功能是作為其他動畫的容器。QAnimationGroup(組)可以是QAbstractAnimation的子類,所有組可以包含其他的組。


動畫框架中的類
這些類提供了創建簡單和復雜動畫的框架。
QAbstractAnimation 其他動畫類的基類
QAnimationGroup Abstract base class for groups of animations
QEasingCurve 控制動畫釋放的曲線
QParallelAnimationGroup 並行動畫組
QPauseAnimation 中止一個串行組
QPropertyAnimation Qt的動畫屬性
QSequentialAnimationGroup 串行動畫組
QTimeLine 控制動畫的時間線
QVariantAnimation Abstract base class for animations
Qt動畫屬性
前邊提到的QPropertyAnimation類能添加新的Qt屬性。前提是它被這個類用作董哈的屬性值。實際上,它的父類QVariantAnimation是一個抽象類,不能被直接使用。
選擇動畫Qt屬性的一個主要原因是使我們能容易的使用已經存在的Qt類和Qt API 進行動畫。類QWidget(可以嵌入到QGraphicsView)有邊界、顏色等屬性。看一個簡單的示例:

QPushButton button("Animated Button");
button.show();

QPropertyAnimation animation(&button, "geometry");
animation.setDuration(10000);
animation.setStartValue(QRect(0, 0, 100, 30));
animation.setEndValue(QRect(250, 250, 100, 30));

animation.start();

這段代碼把一個按鈕在2秒內從屏幕的左上角移動到(250, 250)位置。
上邊的例子在開始和結束值之間做一個線性插值。可以設置開始和結束值點,插值依賴這些點

 

 QPushButton button("Animated Button");
button.show();

QPropertyAnimation animation(&button, "geometry");
animation.setDuration(10000);

animation.setKeyValueAt(0, QRect(0, 0, 100, 30));
animation.setKeyValueAt(0.8, QRect(250, 250, 100, 30));
animation.setKeyValueAt(1, QRect(0, 0, 100, 30));

animation.start();

上例中,按鈕在前8秒移動到(250, 250),最后2秒內又移回原位。移動按照線性插值在兩個點之間移動。

可以創建Qt屬性,需提供訪問方法
class MyGraphicsItem : public QObject, public QGraphicsRectItem
{
           Q_OBJECT
           Q_PROPERTY(QRectF geometry READ geometry setGeometry)
}
上邊示例中,我們子類化QGraphicsRectItem並且定義geometry屬性。即使QGraphicsRectItem沒有geometry屬性,我們也可以使用本組件的geometry屬性進行動畫。

動畫和圖形視圖框架
當我們想讓QGraphicsItems進行動畫,並且使用QPropertyAnimation類。但是,QGraphicsItem沒有從 QObject繼承。一個好的解決方案是子類話你想要動畫的圖形項。而且本類也繼承自QObject。QPropertyAnimation能被使用在 QGraphicsItems中。以下示例顯示了怎么去做。另一個可能是去繼承QGraphicsWidget,QGraphicsWidget是一個 QObject。
class Pixmap : public QObject, public QGraphicsPixmapItem
{
           Q_OBJECT
           Q_PROERTY(QPointF pos READ pos WRITE setPos)
           ……
正如前所述,我們要定義的屬性是要進行動畫的屬性。

松弛曲線
前邊提到過,QPropertyAnimation在開始和結束屬性值中進行插值運算。另外還可以添加更多的關鍵點值。松弛曲線描述了一個函數,用它來控制在0和1之間進行插值的速度,它在不改變路徑只控制速度時非常有用。

QPushButton button("Animated Button");
button.show();

QPropertyAnimation animation(&button, "geometry");
animation.setDuration(3000);
animation.setStartValue(QRect(0, 0, 100, 30));
animation.setEndValue(QRect(250, 250, 100, 30));

animation.setEasingCurve(QEasingCurve::OutBounce);

animation.start();
這個動畫跟隨一個曲線使它彈回,像一個球從開始位置掉落到結束位置。QEasingCurve包含大量的曲線,我們可以去選擇使用。他們使用QEasingCurve::Type定義(枚舉)。如果需要其他的曲線,你可以自己實現一個,並注冊給QEasingCurve

 

把動畫結合在一起
一個應用程序通常包含多個動畫,例如,你可能希望同時移動許多graphic items或者一個個按照串行的方式的移動他們
子類QAnimationGroup(QSequentialAnimationGroup和QParallelAnimationGroup)可以包含其它animations,這樣這些animations可以串行或者並行的觸發了

並行顯示的例子

 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();

一個並行的動畫組可以同時播放多個動畫,調用start()函數將會啟動它所管理的所有animations

串行觸發的例子

 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串行的播放所有的動畫,當list中前一個動畫播放完,它才啟動下一個

你可以把動畫組animatio group添加到其他的動畫組里面,這樣可以創建一個動畫結構樹,樹中已經制定了這些動畫在播放時候彼此之間的關系

 


動畫和狀態
當使用狀態機時候,我們可以將彼此狀態之間用一個或者多個動畫關聯起來,使用QSignalTransition或者QEventTransition類,這兩

個類都繼承自QAbstractTransition,QAbstractTransition提供了方便的函數addAnimation(),可以再狀態轉換觸發時候播放一個或者

多個動畫animations

我們也可以設置各個不同的狀態的屬性,而不用設置動畫的startValues和endValue,下面是一個關聯按鈕QPushButton位置屬性的動畫示例

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();

 

 

 

常見類

QtAbstractAnimation 抽象動畫
QtAnimationGroup 動畫組
QtEasingCurve 釋放曲線
QtParallelAnimationGroup 並行動畫組
QtPropertyAnimation 動畫特性     可以使用Q_PROPERTRY來創建屬性

QtSequentialAnimationGroup 連續動畫組
QtVariantAnimation 變換動畫
QtGraphicsWidget 繪圖部件
QtAbstractState 抽象狀態
QtAbstractTransition 抽象轉換
QtActionState 動作狀態
QtEventTransition 事件轉換
QtFinalState 完成狀態
QtHistoryState 歷史狀態
QtKeyEventTransition 鍵盤事件轉換
QtMouseEventTransition 鼠標事件轉換
QtSignalEvent 信號事件
QtSignalTransition 信號轉換
QtState 狀態
QtStateAction 狀態動作
QtStateFinishedEvent 狀態動作完成事件
QtStateFinishedTransition 狀態動作完成事件
QtStateInvokeMethodAction 狀態請求方法動作
QtStateMachine 狀態機器
---------------------
作者:seanyxie
來源:CSDN
原文:https://blog.csdn.net/seanyxie/article/details/6173337
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM