QParallelAnimationGroup的使用——创建简单的动画
写作思路
本篇博客主要实现在QGraphicsItem 添加特效,主要是基于QParallelAnimationGroup这个类实现动画的播放,实现效果如下,创建可以创建并让星星往复闪烁
本文是在PyQt创建UE蓝图这篇文章的基础上扩展的,将原有的节点绘制改为星星,并添加闪烁特效。
实现步骤:
1、创建一个场景提供绘制,可参考QGraphicsScene、QGraphicsView的基础使用
2、基于QGraphicsItem创建一个星星item
3、基于QParallelAnimationGroup给星星添加特效
1、创建一个场景提供绘制
可参考QGraphicsScene、QGraphicsView的基础使用
2、基于QGraphicsItem创建一个星星item
class StarItem(QGraphicsItem):def __init__(self, scene, parent=None):super(StarItem, self).__init__(parent)self.setFlag(QGraphicsItem.ItemIsMovable, True)self.setFlag(QGraphicsItem.ItemIsSelectable, True)self.setFlag(QGraphicsItem.ItemSendsGeometryChanges, True)self.setFlag(QGraphicsItem.ItemIsFocusable, True)self.scene = sceneself.radius = 50self.anim = Noneself.addAnimation()def addAnimation(self):self.anim = StarAnimation(self, 0.25)self.anim.start()def stopAnimation(self):if self.anim:self.anim.stop()self.anim = Noneself.graphicsEffect().setColor(QColor(0x00, 0x00, 0x00, 0x00))def createGraphicsEffect(self):dropShadow = QGraphicsDropShadowEffect()dropShadow.setColor(QColor(0xff, 0x00, 0x00, 0xff))dropShadow.setBlurRadius(50)dropShadow.setOffset(0)self.setGraphicsEffect(dropShadow)def paint(self, painter, style, *args, **kwargs):painter.setRenderHint(QPainter.Antialiasing)painter.setRenderHint(QPainter.TextAntialiasing)R = self.radiusPi = 3.1415926deg = Pi * 72 / 180points = [QPoint(R, 0),QPoint(R * cos(deg), -R * sin(deg)),QPoint(R * cos(2 * deg), -R * sin(2 * deg)),QPoint(R * cos(3 * deg), -R * sin(3 * deg)),QPoint(R * cos(4 * deg), -R * sin(4 * deg)),]font = QFont()font.setPointSize(12)font.setBold(True)painter.setFont(font)penLine = QPen()penLine.setWidth(2)penLine.setColor(Qt.blue)penLine.setStyle(Qt.SolidLine)penLine.setCapStyle(Qt.FlatCap)penLine.setJoinStyle(Qt.BevelJoin)painter.setPen(penLine)painter.rotate(54)starPath = QPainterPath()starPath.moveTo(points[0])starPath.lineTo(points[2])starPath.lineTo(points[4])starPath.lineTo(points[1])starPath.lineTo(points[3])starPath.closeSubpath()painter.drawPath(starPath)def boundingRect(self):return QRectF(0, 0, self.radius, self.radius)
简要分析一下
1、首先星星的绘制方法在paint中
2、boundingRect方法要重写并且一定要重写,这样才能控制星星,相当于给星星增加了一个触碰区域
3、我们在星星内部封装了三个方法,分别是
生成特效 createGraphicsEffect:使用Qt自带的阴影特效QGraphicsDropShadowEffect,提供一个包围绘制路径内的一个投影
开始动画 startAnimation:创建一个动画的特效,如果不创建这个动画,投影只会静止在星星上
结束动画 stopAnimation:停止动画,并且将投影透明化(也可以直接置None)
3、基于QParallelAnimationGroup给星星添加特效
class StarAnimation(QParallelAnimationGroup):def __init__(self, item, duration):super(StarAnimation, self).__init__()self.item = itemself.duration = durationself.anim = Noneself.finished.connect(self.onFinished)def createAnimations(self):graphicsEffect = self.item.graphicsEffect()if not graphicsEffect:self.item.createGraphicsEffect()graphicsEffect = self.item.graphicsEffect()qba = QByteArray()qba.append("color")anim = QPropertyAnimation(graphicsEffect, qba)anim.setDuration(self.duration * 1000)anim.setStartValue(QColor(0xff, 0x00, 0x00, 0xff))anim.setEndValue(QColor(0x00, 0x00, 0x00, 0xff))self.addAnimation(anim)def start(self, policy=QAbstractAnimation.KeepWhenStopped):self.createAnimations()super(StarAnimation, self).start(policy)def onFinished(self):if self.item:self.item.addAnimation()
要了解两个东西,一个是该动作组的基类QParallelAnimationGroup,另一个是控制属性变化的类QPropertyAnimation
QParallelAnimationGroup: 提供了一个动画组,用于存放动画,并且这些动画是同时播放的,其中几个关键的方法:
①addAnimation(QAbstractAnimation *animation):将动画添加到动画组内
②start(QAbstractAnimation::DeletionPolicy policy = KeepWhenStopped):开始动画
③stop(): 结束动画,其中结束之后会回调 finished()
QPropertyAnimation: 动画的本质就是逐帧变化,我们要提供动画特效产生的是哪几个属性,下面讲一下几个注意的点和几个封装好的关键函数:
①QPropertyAnimation(QObject *target, const QByteArray &propertyName, QObject *parent = nullptr),初始化函数,注意两个点:
1、传入的第一个参数的基类必须是QObject,我们这里使用QGraphicsDropShadowEffect对象基类就是QObject,QGraphicsDropShadowEffect文档
2、传入的第二个参数是QByteArray 对象,并且这个 propertyName必须是要存在于target里面 的,因此我们需要对第二个参数进行一个转化!如下
qba = QByteArray()qba.append("color")
如果传入的propertyName不存在于target是会报错的哦!
②setDuration(int msecs): 属性变化的持续时间(单位是毫秒哦!)
③setStartValue(const QVariant &value):设置初始值(你的这个属性变化的初始状态)
④setEndValue(const QVariant &value):设置终值(属性的结束值)
最后补充一点
在一个 QParallelAnimationGroup 是可以插入多个动画的,因此我们可以创建多个QPropertyAnimation,例如下面:
def createAnimations(self):graphicsEffect = self.item.graphicsEffect()if not graphicsEffect:self.item.createGraphicsEffect()graphicsEffect = self.item.graphicsEffect()qba = QByteArray()qba.append("color")anim = QPropertyAnimation(graphicsEffect, qba)anim.setDuration(self.duration * 1000)anim.setStartValue(QColor(0xff, 0x00, 0x00, 0xff))anim.setEndValue(QColor(0x00, 0x00, 0x00, 0xff))self.addAnimation(anim)qba = QByteArray()qba.append("blurRadius")anim = QPropertyAnimation(graphicsEffect, qba)anim.setDuration(self.duration * 1000)anim.setStartValue(50)anim.setEndValue(500)self.addAnimation(anim)
可以观察到下面gif 不仅仅有颜色上的闪烁,还有光圈的缩放
最后附上一张早期QQ网图 哈哈哈哈哈哈
QParallelAnimationGroup的使用——创建简单的动画相关推荐
- 简单的动画函数封装(2)
<div></div><!-- <span></span> --><button class="btn1"> ...
- 简单的动画函数封装(1)
//创建简单的动画函数封装效果(目标对象,目标位置) function animate(obj,target){var id = setInterval(function(){if(obj.offse ...
- html如何创建关键帧动画旋转,[教程] 用 CSS3 Animations(动画) 和 Keyframes(关键帧) 创建简单的网页动画 – CSS3 实现弹跳球动画...
通过这个有趣的教程学习 CSS Animations(动画) 和 Keyframes(关键帧). 我们要做什么? 下面是最终代码,也就是我们将要最终实现的演示: 基础准备 对于这个实现,我们需要一个简 ...
- CSS3 创建简单的网页动画 – 实现弹跳球动
基础准备 对于这个实现,我们需要一个简单的 div ,并且样式类名为 ball : HTML 代码: <div class="ball"></div> 我们 ...
- three.js创建简单动画(vue中使用three.js59)
简单动画 1.demo效果 2.知识要点 2.1 three.js动画分类 2.1.1基础动画 2.1.2移动相机 2.1.3变形和蒙皮 2.1.4加载外部动画 2.2 基础动画实现方式 2.2.1 ...
- Maya创建科幻3D动画循环场景视频教程
Maya创建科幻3D动画循环场景视频教程 Skillshare – Create a Sci-Fi 3D Animation Loop in Autodesk Maya 持续时间3h 27m 包括项目 ...
- Windows Phone 8初学者开发—第22部分:用演示图板创建卷盘的动画
原文 Windows Phone 8初学者开发-第22部分:用演示图板创建卷盘的动画 第22部分: 用演示图板创建卷盘的动画 原文地址:http://channel9.msdn.com/Series/ ...
- Qt基于QGraphicsObject自定义图元并实现简单的动画
文章目录 Qt基于QGraphicsObject自定义图元并实现简单的动画 举例; Qt基于QGraphicsObject自定义图元并实现简单的动画 Qt 图形的绘制 可以是QPainter方法直接绘 ...
- 计算机动画分为关键帧动画和,一个最简单的动画最少有几个关键帧
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 一个最简单的动画至少有两个关键帧,两个关键帧中必须是元件,而且必须是同一个元件.要创建使组合体或文字发生颜色渐变的动画,必须先将它 ...
- 自定义动画属性java_创建酷炫动画效果的10个JavaScript库
原标题:创建酷炫动画效果的10个JavaScript库 1) Dynamics.jsDynamics.js是设计基于物理规律的动画的重要Java库.它可以赋予生命给所有包含CSS 和SVG属性的DOM ...
最新文章
- StaticFactoryMethod_Level2
- js算法入门(2)--哈希表
- Android中脱离WebView使用WebSocket实现群聊和推送功能
- linux tr 变量大小写,使用tr命令快速达到大小写互换——深圳培训linux
- ubuntu linux本地源,如何制作UbuntuLinux操作系统的本地源?
- CCIE试验备考之交换security
- 使用 vue_VUE使用ECharts教程
- 三到五年Java简历模板
- Python:SEIR传染病模型
- 设置计算机屏幕保护程序,电脑屏保怎么设置?一键设置电脑屏幕保护方法
- win7系统修改磁盘提示参数错误的解决办法
- 清除此计算机中wps云盘,Win10专业版系统怎么把电脑上的WPS网盘彻底删掉?
- 北京超级云计算中心操作训练指南
- 为什么视频云服务会被各行业广泛看好?
- 如何在windows下运用dd来下修复坏块?
- 计算机硬件有哪些升级空间等级查询,你的电脑要不要升级内存?怎么升级?答案都在这里~...
- PLS-00907: cannot load library unit
- October 20th 2017 Week 42nd Friday
- (一)Flink从入门到项目实战——Flink介绍——董长春
- mysql 执行计划 order_MySQL · 捉虫动态 · 5.6中ORDER BY + LIMIT 错选执行计划