91.动画的简单使用

动画继承结构图如下所示

QAbstractAnimation 抽象动画

  • QAnimationGroup 动画组
    • QParallelAnimationGroup 同时做的动画组
    • QSequentialAnimationGroup 顺序做的动画组
  • QPauseAnimation 暂停动画
  • QVariantAnimation 变体动画
    • QPropertyAnimation 属性动画

目录

1  动画使用步骤

1.1  构造动画对象并设置目标属性

1.1.1  构造函数

1.1.2  添加属性

1.1.3  添加对象

1.2  设置开始值,结束值

1.3  设置时长 setDuration()

1.4  启动动画

2  完善步骤

2.1  尺寸更改 size

2.2  位置和大小 geometry

2.3  窗口不透明度 windowOpacity

2.4  设置插入值 setKeyValueAt()

2.5  设置动画速度曲线 setEasingCurve()

3  QVariantAnimation

4  QAbstractAnimation 方法

4.1  循环操作

4.1.1  设置 setLoopCount()

4.1.2  获取一共循环几次 loopCount()

4.1.3  获取当前是第几次循环 currentLoop()

4.1.4  获取当前循环内进行的时间 currentLoopTime()

4.2  时间操作

4.3  动画方向

4.3.1  设置 setDirection()

4.3.2  获取 direction()

4.4  常用操作

4.5  动画状态

4.6  状态案例

5  常用信号

6  动画组

6.1  QAnimationGroup

6.2  QParallelAnimationGroup 并行动画

6.3  QSequentialAnimationGroup 串行(顺序)动画

6.3.1  加入暂停动画

6.3.2  获取当前动画

6.3.3  信号


1  动画使用步骤

我们使用QPropertyAnimation做一个例子

直接父类是QVariantAnimation,用于实现属性值变换时的动画,我们使用时大概分为下面这几步

我们首先创建一个按钮

1.1  构造动画对象并设置目标属性

1.1.1  构造函数

这个构造函数有两种写法,一种是直接写父对象,第二种是把目标和属性也写进去

1.1.2  添加属性

如果在这里只写入了父对象,也可以通过类中的方法添加属性

后面的参数需要一个字节类型的值,我们这样写,这个的意思就是做动画对象的pos这个属性

  • 可以使用dynamicPropertyNames()获取对象的所有属性,这个在4.QObject的基本用法2.1 中提到过

1.1.3  添加对象

我们做一个例子

创建一个动画对象,作用目标是btn,作用属性是pos

也可以写到一起

1.2  设置开始值,结束值

我们现在设置开始值和结束值,让目标从(0,0)移动到(100,100)

1.3  设置时长 setDuration()

我们现在设置动画时长为3000ms

1.4  启动动画

我们现在直接令其打开窗口就启动动画,所以在代码后面直接加start()就可以了

运行之后确实发现按钮在移动

2  完善步骤

在更改属性中,我们常用的属性有下面这四个

刚才我们测试过了pos,现在我们测试别的

2.1  尺寸更改 size

这样这个按钮就用从小变大了

2.2  位置和大小 geometry

这个属性的含义是尺寸与位置的结合

对应变量类型为QRect(),前面两个值为位置,后面两个值为大小,QRect(x,y,宽,高)

这个动画就会改变位置和大小

2.3  窗口不透明度 windowOpacity

它的取值范围是[0,1]中所有浮点数,1是不透明,0是透明

我们现在从透明 变到 不透明

2.4  设置插入值 setKeyValueAt()

我现在想让窗口一次从 透明 变到 不透明,然后再从 不透明 变到 透明,这个时候我们需要用到插值

第一个参数是在动画进行到什么时候变为后面的值,取值[0,1]之间所有浮点数,第二个参数是变成的值

我们也可以使用setKeyValueAt()代替结束值

经测试效果相同

可以插入多个插值

2.5  设置动画速度曲线 setEasingCurve()

这个是对动画的速度进行设置,我们如果没设置的话就是匀速进行动画,如果设置就会变速进行动画,不光是移动可以使用动画速度曲线,改变透明度,改变尺寸也可以使用动画速度曲线

  • 感觉上还是插入值好用一些

在官方文档中可以查看取什么值

也可以在库中的py文件中查看,这个我就不每个都试一遍了

BezierSpline = 45 CosineCurve = 44 Custom = 47 InBack = 33 InBounce = 37 InCirc = 25 InCubic = 5 InCurve = 41 InElastic = 29 InExpo = 21 InOutBack = 35 InOutBounce = 39 InOutCirc = 27 InOutCubic = 7 InOutElastic = 31 InOutExpo = 23 InOutQuad = 3 InOutQuart = 11 InOutQuint = 15 InOutSine = 19 InQuad = 1 InQuart = 9 InQuint = 13 InSine = 17 Linear = 0 OutBack = 34 OutBounce = 38 OutCirc = 26 OutCubic = 6 OutCurve = 42 OutElastic = 30 OutExpo = 22 OutInBack = 36 OutInBounce = 40 OutInCirc = 28 OutInCubic = 8 OutInElastic = 32 OutInExpo = 24 OutInQuad = 4 OutInQuart = 12 OutInQuint = 16 OutInSine = 20 OutQuad = 2 OutQuart = 10 OutQuint = 14 OutSine = 18 SineCurve = 43 TCBSpline = 46

下面这个弹簧效果是用的比较多的,可以试一下

3  QVariantAnimation

QVariantAnimation是QPropertyAnimation的直接父类,下面这些方法也都介绍过,就不一一测试了

4  QAbstractAnimation 方法

是所有动画类对象的基类,我们说一下之前没涉及到的操作,动画对象我们还是使用QPropertyAnimation

4.1  循环操作

4.1.1  设置 setLoopCount()

我们现在有一个移动位置的动画

现在我们让他循环三次

确实运行了三次

4.1.2  获取一共循环几次 loopCount()

我们可以把这个方法绑定给我们做动画的按钮

运行之后在每一次做动画时都按一下按钮

4.1.3  获取当前是第几次循环 currentLoop()

也是一样,绑在按钮上,每做一次动画点击一次

4.1.4  获取当前循环内进行的时间 currentLoopTime()

也是一样,绑在按钮上,每做一次动画点击一次

这三个值都是运行的毫秒数

4.2  时间操作

这个就是字面意思,当前时长是相对于动画总时长的时长,这三个都是获取,不做测试了

4.3  动画方向

参数QAbstractAnimation.Direction有两个可选参数

  • 0 - QAbstractAnimation.Forward 正向动画
  • 1 - QAbstractAnimation.Backward 反向动画

4.3.1  设置 setDirection()

默认是正向动画,我们现在设置为反向动画

经测试,按钮从(100,100)移动到(0,0)

  • 这个例子是改位置属性,改其他属性同样可以更改动画方向

4.3.2  获取 direction()

  • 如果动画方向更改,它的时间也会更改,是反着走的,比如说我设置动画时间为3000ms,如果正向就是0->3000,如果反向就是3000->0

4.4  常用操作

  • start() 动画开始,在其中可以放动画的删除策略
  • pause() 动画暂停
  • resume() 动画继续
  • stop() 动画停止
  • setCurrentTime() 设置当前动画时间
  • setPause() 设置动画是否暂停,True为暂停,False为不暂停

动画的删除策略有两个可选值

  • QAbstractAnimation.KeepWhenStoped 停止时不会删除动画
  • QAbstractAnimation.DeleteWhenStopped 停止时动画将自动删除
  • 注:这里的删除是真的删除了,删除之后无法再使用start启动,也就是说动画对象被释放掉了

这个就是字面意思,就不测试了

4.5  动画状态

这个是获取当前动画的状态,有三个返回值

  • QAbstractAnimation.Stopped 停止状态
  • QAbstractAnimation.Paused 暂停状态
  • QAbstractAnimation.Running 运行状态

4.6  状态案例

我们对这个状态做一个综合的案例,我们现在有两个按钮,一个控制start和stop,一个控制暂停和启动

当前我有这样一个动画

然后我搞两个按钮,然后再搞两个槽函数

经测试可以达到效果

  • 点下停止之后它会停在原地,此时使用start()它会从初始位置启动

5  常用信号

  • currentLoopChanged() 完成循环时触发,会传递当前的循环轮数
  • directionChanged() 动画方向改变时触发,会传递当前的方向
  • finished() 动画播放完成时触发(如果有循环就是所有循环都走完触发)
  • stateChanged() 动画状态改变时触发,会传递两个参数,第一个为新的状态,第二个为老的状态

6  动画组

6.1  QAnimationGroup

是动画组的基类,有以下功能

动画组使用添加动画方法就可以添加另一个动画组

我们一会儿使用子类做例子验证上面的方法

我们现在做这样一个动画,现在有两个按钮,红按钮顺时针走矩形,蓝按钮逆时针走矩形

为了方便看我们把窗口搞大一点,然后放两个按钮

先搞红按钮的动画,先用start测试以下,测试后删掉

发现可以成功的走

再搞蓝按钮

由于现在是两个我都使用了start(),所以现在它们是并行运行

6.2  QParallelAnimationGroup 并行动画

同时执行动画的动画组

我们现在把start()删掉,然后创建一个并行动画组,把两个动画加入到动画组里,然后start

经测试可以成功并行执行动画

如果想让动画组进行循环,我们直接就可以对动画组加入循环

经测试有效

6.3  QSequentialAnimationGroup 串行(顺序)动画

顺序执行动画的动画组

发现可以成功串行执行动画,先移动btn1,后移动btn2

下面三个功能是 QSequentialAnimationGroup 独有的功能

6.3.1  加入暂停动画

我们可以在动画执行过程中加入暂停,比如我现在暂停3000ms

这样btn2会在btn1结束后3000ms再开始运动

也可以插入暂停

上面的插入暂停和加入暂停效果相同

暂停也算动画对象的一种,这个类我们在上面的继承结构图看过,在这

在QPauseAnimation中有设置暂停时长setDuration()这一功能

6.3.2  获取当前动画

获取当前播放的动画,暂停也算动画一种,如果此时处于暂停状态算暂停动画

6.3.3  信号

当播放动画发生改变时触发该信号,会传递当前的动画对象

先是由btn1切换到暂停动画触发一次,然后暂停动画切换到btn2又触发一次

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值