animation皮毛学习
说明
- 学习资源:
- 我就差不多是把他们的东西加个包装盒,然后一个一个的搬运过来,这个包装盒我(会)尽(把)量(人)搞(弄)好(糊)一(涂)点(的)。
- 因为不是什么没有很系统的学习,所以这里的笔记着重应用方面,一些概念就可能不是很清楚,要在实践过程中慢慢领悟
概述(扯淡)
Qt动画框架既是独立的一部分,也是Qt状态机框架的一部分。
Qt状态机
框架提供一个状态用来行使动画。当QState
进入或者退出时可以改变属性,当这个动画状态提供了一个QPropertyAnimatio
时,则动画状态即在这些值之间进行插值衍化操作。(注意到几个关键词,感觉在程序中会经常碰到)
下面是Qt动画框架类(常见的)(通俗的讲就是做简单和复杂动画的基础)
QAbstractAnimation
: 所有动画类的基类QAnimationGroup
: 动画容器类的抽象基类QEasingCurve
: 动画控制的缓和曲线类QParallelAnimationGroup
: 并行动画容器QPauseAnimation
: QSequentialAnimationGroup对象暂停延迟QSequentialAnimationGroup
: 串行动画容器QTimeLine
: 动画控制的时间片类QVariantAnimation
: 动画类的抽象基类QPropertyAnimation
: Qt动画属性操作 (常见)
举个小栗子(动画中的hello world)
# -*- coding:utf8 -*- from PyQt4 import QtCorefrom PyQt4 import QtGuifrom PyQt4.QtGui import *from PyQt4.QtCore import *import sysapp = QApplication(sys.argv)window = QMainWindow()window.show()animation = QPropertyAnimation(window, "geometry")animation.setDuration(10000)animation.setStartValue(QRect(0, 0, 100, 30))#animation.setKeyValueAt(0.5, QRect(240, 240, 100, 30));animation.setEndValue(QRect(250, 250, 100, 30))# animation.setEasingCurve(QEasingCurve.OutBounce)animation.start()app.exec_()
- 10秒的时间内,把window从屏幕的左上角移动到(250,250)点处
- 上述代码在开始值与结束值之间做了
线性插值
。当然,在开始处与结束处之间插入数值也可以(把第一个注释去掉)。 - QPropertyAnimation在开始与结束之间执行插值操作。除了对动画操作设置更多关键值之外,你也可以使用缓和曲线,缓和曲线控制着在0与1之间的插值速度,如果你想在没有改变插值路径的情况下改变动画速度,那么缓和曲线是很有用的。(把第二个注释去掉)
再举个小例子(动画分组)
# -*- coding:utf8 -*- from PyQt4 import QtCorefrom PyQt4 import QtGuifrom PyQt4.QtGui import *from PyQt4.QtCore import *import sysapp = QApplication(sys.argv)window = QMainWindow()window.show()window2 = QMainWindow()window2.show()animation = QPropertyAnimation(window, "geometry")animation2 = QPropertyAnimation(window2, "geometry")group = QParallelAnimationGroup()animation.setDuration(10000)animation.setStartValue(QRect(0, 0, 100, 30))animation.setEndValue(QRect(250, 250, 100, 30))animation.setEasingCurve(QEasingCurve.OutBounce)animation2.setDuration(10000)animation2.setStartValue(QRect(250, 150, 100, 30))animation2.setEndValue(QRect(850, 250, 100, 30))animation2.setEasingCurve(QEasingCurve.CosineCurve)group.addAnimation(animation)group.addAnimation(animation2)group.start()app.exec_()
- 一个应用程序常常包含不止一个动画。例如,你或许希望同时移动不止一个图形项或者一个接着一个的顺序移动它们。
- QAnimationGroup (QSequentialAnimationGroup和QParallelAnimationGroup)的子类是动画容器类,因此多个动画可以被串行或者并行。QAnimationGroup类就是一个例子,其不操作动画属性,但是它能周期性的获得定时通知,这使得它能把定时通知应用于动画中,从而进行控制。
动画和状态
-
当使用Qt状态机时,我们可以使用QSignalTransition或QEventTransition类将一个或者多个动画与状态之间的切换中进行关联。这些类继承于QAbstractTransition,QAbstractTransition类提供了方便的函数addAnimation(),该函数在状态切换发生的情况下能触发一个或多个被附加的动画。
-
我们也可以和状态进行属性关联,而不是自己设置开始和结束值,下面就是一段完整的动画操作QPushButton位置的代码例子
<!-- lang: python -->
from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4.QtGui import * from PyQt4.QtCore import * import sys app = QApplication(sys.argv) button = QPushButton() button.show() machine = QStateMachine() stateone = QState(machine) stateone.assignProperty(button, "geometry", QRect(100, 100, 100, 60)) machine.setInitialState(stateone) statetwo = QState(machine) statetwo.assignProperty(button, "geometry", QRect(250, 250, 100, 60)) transition1 = QSignalTransition() transition1 = stateone.addTransition(button, SIGNAL("clicked()"), statetwo) a1 = QPropertyAnimation(button, "geometry") transition1.addAnimation(a1) transition2 = QSignalTransition() transition2 = statetwo.addTransition(button, SIGNAL("clicked()"), stateone) a2 = QPropertyAnimation(button, "geometry") transition2.addAnimation(a2) machine.start() app.exec_()
-
点击按钮,改变状态机,从而触发动画