状态机与动画
关键字:动画 状态机 窗体 Geometry
一、概念
状态(State):是静态的东西,对一系列对象属性的一组静态描述和配置。
状态机(State Machine):管理了所有的状态,并提供状态轮转机制
过渡(Transition):是一段时间或者空间的描述,状态之间切换的整个过程,或者描述的是不同属性值之间变化的一个过程。在现实中,状态切换常常不是瞬间完成,它有很多中间态,比如日出到日落这一个动作,在中间不同的时间点,太阳都处在日出与日落的中间态。过渡可以理解为一种缓冲。
过渡曲线(Transition Curve):对属性值变化给出具体的变化函数,来修饰整个过渡过程。比如,下落的石头速度越来越快,在不同的时间点石头有不同的速度,它的下落的距离与时间曲线满足以下关系:h = vt + 1/2 * 。
动画(Animation):是动态的一个东西,可以看作是过渡的执行者,通过在属性值上应用动画类型来创建。动画类型会对属性值进行插值,从而创建出平滑的过渡效果。要创建动画,需要为某个属性使用恰当的动画类型;应用的动画也依赖于需要实现的行为类型。
Qt动画在执行过渡过程,提供了多种属性过渡曲线,用户可以选择适合业务场景的曲线来修饰自己的过渡过程。QParallelAnimationGroup 提供了并行执行多个动画的功能,QSequentialAnimationGroup 提供了串行执行多个动画的功能,动画组之间可以嵌套,实现并行中有串行,串行中有并行。
二、Qt相关类和函数
类:
QStateMachine 状态机类,继承了QState类
QState 状态类
QSignalTransition 过渡信号
QPropertyAnimation属性动画
函数:
->QStateMachine::setInitialState( QState * ) 设置起始状态,状态机启动前必须设置初始状态。
->QState::assignProperty(QObject * obj, const char *propertyName, const QVarient &value ):为状态绑定属性
->QPropertyAnimation:: setDuration( int msec ) 设置动画执行时间。
->QPropertyAnimation:: setEasingCurve(const QEasingCurve & curve) 设置属性动画属性值变化曲线;
->QState::addTransition(const QObject *sender, const char *signal, QAbstractState *target),为状态机绑定信号,信号触发时,状态机轮转。
-> QSignalTransition::addAnimation(QAnimation *) 为状态机轮转添加过渡动画,过渡算法与动画绑定,动画的起始态和终态由状态机来指定。
-> QStateMachine::start() 启动状态机
三、实现逻辑
准备过程:
->定义动画,将过渡算法(过渡曲线与时间)绑定在动画中;
->将不同的动画绑定到具体的状态;
->定义状态切换的触发点;
->将状态添加在状态机中,并设定初始状态。
执行过程:
->启动状态机,等待信号触发。
->信号触发后,如果发送状态切换,执行状态绑定的动画。
->动画则解析具体的属性,根据过渡算法和动画执行时间间隙,对属性进行插值。
->根据所插入的值和时间间隙,绘制出动画。
四、代码实现