详解Qt的动画框架(一)

Qt的动画框架是在4.6版本引入的。通过Qt动画属性,Qt动画框架为部件和其他QObject对象的动画操作提供了非常大的自由性。Qt动画框架也能用于图形视图框架中。以下是Qt中的有关动画框架类的类视图:

Qt的动画框架的Base是由QAbstactionAnimation以及它的两个子类QVariantAnimationQAnimationGroup组成。QAbstractAnimation类是所有动画类的祖先。它包含了一些在框架中被普遍使用的基本功能;尤其是启动、停止和暂停动画功能。它也接收定时触发通知。

Qt动画框架更是提供了QPropertyAnimation类,该类继承于QVariantAnimation类,用于对Qt属性的动画操作(Qt属性系统是Qt元对象系统的一部分)。QPropertyAnimation类使用缓和曲线算法对属性进行插值演化操作。因此当你想动画改变一个值时,你就声明该值为一个属性值并且使该类为成为一个QObject对象。这给我们提供了很大的方便性去动画操作现有的部件和其他的QObject对象。

复杂动画可以通过构建QAbstractAnimation树形结构来构造。该树主要使用QAnimationGroupQAnimationGroup类是一个包含其他动画类的容器类;同时QAnimationGroup类也是QAbstractAnimation类的子类,因此一个容器可以包含其他容器。

一下的图表是对以上类的介绍:

下面将详细介绍可能在使用中较为多的QPropertyAnimation。以下是该类的public属性的成员函数。

可以注意到,对于该类,有一个重要的成员变量应该就是propertyName,对于该propertyName,我们可以自己定义,当然也可以使用Qt已有的properties,对于每一个继承与QObject的类,都有自己或者公共的属性,例如QWidget以及继承其QWidget的类都包含了geometry的属性,其Type为QRect(这个属性在后面的篇章,介绍Qt的动画框架的使用时会介绍到)。QObject就是嵌入动画的载体。

我们选用Qt动画属性的一个主要原因是由于它给了我们很大的自由性去动画操作已经存在的类,尤其是拥有bounds、colors等属性的QWidget类(QWidget能被嵌入到QGraphicsView类)。

此外,继承自QVariantAnimation类的几个函数,无论是在使用Qt对象的自己本身就具备的属性,还是自己新添加进去的属性(利用Q_PROPERTY实现),会在使用动画框架中经常使用到:

在后续的篇章中,将会介绍如何通过自定义属性,为控件添加动画控制。

其中对函数的介绍如下:

  • void  setDuration(int msecs)函数是设置动画持续的时间。
  • voidsetEasingCurve(const QEasingCurve & easing)函数可以设置动画的缓和曲线,可以理解为移动曲线。例如QEasingCurve::InCirc可以提供圆形凹型曲线,QEasingCurve::Linear可以提供一个直线。
  • voidsetStartValue(const
    QVariant & value)
    用于设置动画的开始位置,这个位置和属性是密切相关的,属性的Type是什么,这里的value也必须是什么Type的,比如在propertyName为geometry,其属性是QRect,这里的数据的Type也应该是QRect.
  • voidsetEndValue(const QVariant & value)和voidsetStartValue(const
    QVariant & value)一直,设置的是动画结束的位置。

以下是使用的小例子:

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

这个例子,可以将button在10000ms即10s内将一个button从屏幕左上角(0,0)的位置移动到(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();

该例子就实现了在8s内从屏幕左上角移动至(250,250),同时在剩下的2s内回到出发位置的过程。

在下一篇将会介绍QPropertyAnimation具体的使用。

时间: 2024-09-30 06:55:22

详解Qt的动画框架(一)的相关文章

详解Qt动画框架(2)--- 实现网易云音乐tag切换

在详解Qt的动画框架(一)介绍了关于Qt动画框架一些基础知识,在这一节中,将会实际的看到有关与动画框架的实现,该案例主要实现的具体是网易云音乐tag的切换,网易云音乐中的切换如图所示: 本文介绍的方法也可以达到这种切换的简易效果. 设计动画框架 首先我们需要设计对于动画框架,其需要的动画效果是什么?对于上图,我们需要的是三个tag可以不停的切换,可以抽象为左移以及右移,即一个tag从一个矩形区域,移动到另外的矩形区域,那么对于Tag的承载体选为什么较为合适呢?因为我们仅仅只需要图片的显示,因此Q

JavaFX学习之道:详解JavaFX架构与框架

JavaFX 2.0平台是基于Java技术的富客户端平台.它使应用程序开发者更加容易的开发和部署跨平台的富互联网应用(RIA).JavaFX 2.0文档包含了JavaFX 2.0所提供的功能的概述. 图1描述了JavaFX 2.0平台的架构组件.后面的部分将对每一个组件进行逐一的描述.在JavaFX通用API的下面是用来运行JavaFX代码的引擎.这个引擎包括以下子组件:JavaFX高性能图形引擎(Prism);新的更小但更有效率的窗体系统(Glass);媒体引擎和Web引擎.虽然这些组件不是包

Android 动画详解之属性动画(Property Animation)

转载请注明http://blog.csdn.net/u014163726/article/details/41210951 前文也提到过Android 3.0以后引入了属性动画,属性动画可以轻而易举的办到许多View动画做不到的事,今天我们就来学习一下属性动画. 前文提到过View动画只是改变了View的绘制效果,而属性动画则是真正的改变一个属性,效果如下图. 对比Android 动画详解之View动画我们可以看到明显的区别,那么属性动画究竟是怎么用的呢,莫慌,接下来代码奉上. 1,Object

Android 动画详解之属性动画(Property Animation)(下)

Hello,大家好,最近好长时间没有写博客了,因为我决定辞职了. 废话不多说,我们还是来看属性动画在上一篇Android 动画详解之属性动画(Property Animation)中我们简单的介绍了一下属性动画的用法,其实属性动画还有更多有趣的用法. 1,在xml中使用 在eclipse中我们右键新建xml可以选择新建属性动画,如图 我们选择objectAnimator,然后我们就会看到熟悉的一幕 然后我们用智能提示就可以看到更熟悉的 没错,这下我们应该知道怎么用xml布局来写属性动画了吧 <s

android动画详解四 创建动画

· 使用ValueAnimator进行动画 通过指定一些int, float或color等类型的值的集合,ValueAnimator 使你可以对这些类型的值进行动画.你需通过调用ValueAnimator 的某个工厂方法来获得一个ValueAnimator 对象,比如:ofInt(), ofFloat(), 或 ofObject().例如: ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f); animation.setDuration

Qt之动画框架

简述 Qt动画框架旨在为创建动画和平滑的GUI提供了一种简单的方法.通过Qt动画属性,该框架为部件和其它QObject对象的动画操作提供了非常大的自由性,框架也可以被用于图形视图框架中,动画框架中许多可用的概念也可以用于Qt Quick,它提供了一种声明式的方式定义动画.大部分关于动画框架学到的知识都可以应用于Qt Quick. 本篇,我们阐述了Qt动画框架的基本结构.同时,会展示最常见的技术示例,用于动画操作QObject和图形项. 简述 动画框架结构 动画框架类 Qt动画属性 动画和图形视图

AxureRP7.0基础教程系列 部件详解 Inline Frame 内部框架

原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> Inline Frame 内部框架 使用内部框架,可以嵌入视频,地图,和HTML到您的原型设计中.使用案例 模拟移动体验 使用手机外壳部件,并在手机外壳的内容区域添加内部框架,内部框架可以签入其他页面或站外链接并显示在手机外壳的屏幕上.这样可以在你的电脑上实现模拟移动设备的体验. 签入外部内容 外部的HTML文件.视频.地图等内容都可以签入到内部框架中

Google推荐——Glide使用详解(图片加载框架)

零.前言 本文所使用的Glide版本为3.7.0 一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所周知的简介就到此为止了)Glide 对于 Android SDK 的最低要求是 API level 10Glide滑行的意思,可以看出这个库的主旨就在于让图片加载变的流畅.现在被广泛使用,当然还是有很多开发者使用Square公司的picasso,也有

详解 Qt 线程间共享数据(用信号槽方式)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一