QT动画框架
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动画框架(The Animation Framework)
QT的动画框架也是引入至QT4.6,很有可能是配合图形系统框架为了下一代UI 做的铺垫
动画框架的类:
QAbstractAnimation The base of all animations QAnimationGroup Abstract base class for groups of animations QEasingCurve Easing curves for controlling animation QParallelAnimationGroup Parallel group of animations QPauseAnimation Pause for QSequentialAnimationGroup QPropertyAnimation Animates Qt properties QSequentialAnimationGroup Sequential group of animations
QTimeLine Timeline for controlling animations QVariantAnimation Abstract base class for animations
类别
狭义的来说,Animation Framework指的是以QAbstractAnimation为基类的几个相关的Animation类,主要用途是用于动画QWidget/QObject的属性(property)
稍微放宽一点来说,还包括QTimeLine,顾名思义,它并不直接绑定并修改某个对象属性,而是根据设定的时间轴,发送信号,用于绑定特定slot,执行相关操作,所以应该不止动画,也不限于属性,你可以用它来做任何你想做的和时间轴相关的事。
其次,还有专用于QGraphicsItem的QGraphicsItemAnimation类,它主要和QTimeLine配合,控制QGraphicsItem的坐标变换矩阵
再广义一点,QT状态机在状态转换时可以绑定设置控件属性,你也可以认为这是一种动画效果,当然,如果不和一个Animation类配合的话,属性值的改变是瞬间完成的,没有中间动画过程。
特性
动画曲线
标准的Animation类,通过设置关联属性的起始和结束值,使用线性插值计算中间过程的属性值。
QTimeline类也可以设置中间任意点的参数值。
这样的动画效果可能不一定是你所需要的:比如模拟一个球的落地弹跳过程。
通过设置动画曲线(Easing Curve),你可以制定参数的变化过程符合特定的曲线规律。
关联动画
如果你需要同时动画一组对象,或者对同一对象,按顺序执行一组动画效果,QAnimationGroup及其子类提供了并行/串行执行动画效果的能力,通过叠加组合,你可以得到更复杂的动画执行序列。
状态机驱动
你也可以通过状态机(QState类)驱动动画。
查看类的属性:
以QGraphicsObject为例
QGraphicsObject的属性可以查看它的定义:
以Q_PROPERTY开头的都是,属性也是可以继承的
class Q_GUI_EXPORT QGraphicsObject:public QObject,public QGraphicsItem
{
Q_OBJECT
Q_PROPERTY(QGraphicsObject*parent READ parentObject WRITE setParentItem NOTIFY parentChanged DESIGNABLE false)
Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged FINAL)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL)
Q_PROPERTY(QPointF pos READ pos WRITE setPos FINAL)
Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged FINAL)
Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged FINA)
......
}
典型的例子:
#include<QApplication>
#include<QWidget>
#include<QLabel>
#include<QPixmap>
#include<QPropertyAnimation>
#include<QSequentialAnimationGroup>
#include<QParallelAnimationGroup>
int main(int argc,char*argv[]){
QApplication app(argc,argv);
QWidget*w=new QWidget();
w->resize(300,400);
QLabel*bird_1=new QLabel("bird_1",w);
QPropertyAnimation*anim1=new QPropertyAnimation(bird_1,"pos");
anim1->setDuration(2000);
anim1->setStartValue(QPoint(0,360));
anim1->setEndValue(QPoint(110,180));
QPushButton*bird_2=new QPushButton("bird_2",w);
QPropertyAnimation*anim2=new QPropertyAnimation(bird_2,"pos");
anim2->setDuration(2000);
anim2->setStartValue(QPoint(0,0));
anim2->setEndValue(QPoint(150,180));
anim2->setEasingCurve(QEasingCurve::OutBounce);
QSequentialAnimationGroup*group=new QSequentialAnimationGroup;
//QParallelAnimationGroup*group;
group->addAnimation(anim1);
group->addAnimation(anim2);
group->start();
bird_1->move(-40,-40);
bird_2->move(-40,-40);
w->show();
return app.exec();
}
状态机驱动的例子:
#include<QApplication>
#include<QStateMachine>
#include<QPushButton>
#include<QSignalTransition>
#include<QPropertyAnimation>
int main(int argc,char**argv)
{
QApplication app(argc,argv);
QWidget*w=new QWidget;
w->resize(240,320);
QPushButton*button=new QPushButton("hicjiajia",w);
QStateMachine*machine=new QStateMachine;//新建状态机
QState*state1=new QState(machine);//状态1
QState*state2=new QState(machine);
state1->assignProperty(button,"geometry",QRect(0,0,80,30));//绑定button的geomertry属性
state2->assignProperty(button,"geometry",QRect(w->width()-30,w->heigh t()-80,30,80));
QFont font=QFont("Airl",12);
state2->assignProperty(button,"font",font);//状态2字体
machine->setInitialState(state1);//state1设为初始化状态
QPropertyAnimation*ani=new QPropertyAnimation(button,"geometry");
ani->setDuration(2000);
ani->setEasingCurve(QEasingCurve::OutBounce);//动画效果—弹跳
QSignalTransition
*transition1=state1->addTransition(button,SIGNAL(clicked()),state2); //动画触发信号
QSignalTransition
*transition2=state2->addTransition(button,SIGNAL(clicked()),state1);
transition1->addAnimation(ani);
transition2->addAnimation(ani);
machine->start();//开启状态机
w->show();
return app.exec();
}
以TimeLine为例:
TimeLine 和QGraphicsView一起完成动画
#include<QtGui>
int main(int argc,char*argv[])
{
QApplication app(argc,argv);
QGraphicsItem*ball=new QGraphicsEllipseItem(0,0,20,20);
QTimeLine*timer=new QTimeLine(5000);
timer->setFrameRange(0,100);
QGraphicsItemAnimation*animation=new QGraphicsItemAnimation;
animation->setItem(ball);
animation->setTimeLine(timer);
for(int i=0;i<200;++i)
animation->setPosAt(i/200.0,QPointF(i,i));
QGraphicsScene*scene=new QGraphicsScene();
scene->setSceneRect(0,0,250,250);
scene->addItem(ball);
QGraphicsView*view=new QGraphicsView(scene); view->show();
timer->start();
return app.exec();
}。