外部使用QT自带的缓动函数EasingCurve C++动画

外部使用QT自带的缓动函数EasingCurve C++动画

QT动画transitions提供了移动动画,可以通过使用transitions调用的函数在自己的c++中实现移动动画逻辑,得到每单位时间移动的位移。

自定义移动动画

可以利用移动的位移,根据测试,手动定义每单位时间移动的位移,通过位移的当前值和目标值比较,手动计算得到一套移动动画。

缓动函数

缓动函数里提供了多种缓动曲线类型,如匀速的,先加速后减速,常见的车辆斜坡起步的先后退再前进加速,以及弹簧效果等49种不同类型,提供了可以通过配置缓动类型,直接调用不同的缓动公式。原本该缓动函数是用于QT界面中的transitions,在QML中写移动动画失败调用,使用非常方便,transitions: Transition { PropertyAnimation { properties: "x,y"; easing.type: Easing.InOutQuad } }就表示以“InOutQuad”缓动曲线移动目标的x,y值。

原理

根据本次动画的总时间(需要动画开始前自定义),当前运动的时间(范围为0~总时间,需要自定义时间间隔,若是循环调用的函数,就相当于循环一次的时间),根据当前运动的时间,缓动公式计算出当前应该移动的位移比例,根据总位移 * 移动比例得出实际移动的位移数(该位移可以是移动的米,厘米,旋转的角度等),直到当前运动的时间为总时间,运动的总位(整个动画的移动总位移)移为目标移动位移。

头文件

缓动函数定义在qeasingcurve.h,需要看源码的话可以在qt源码中找到该文件,类为QEasingCurve。

调用

在项目中包含上述头文件,若项目中没有包含qt相关库,可以直接把上述头文件和源文件放到项目中编译。使用时声明缓动类型,如 type = QEasingCurve::InOutCubic,缓动函数中double process = easing.valueForProgress(当前时间 / 总时间)的返回值得到的是当前移动的总位移/总位移,可(process - 上一次的process) * 总位移即可得到本次时间间隔内应该移动的位移数。

总结

在C++中使用QT自带的缓动函数,必须包含缓动函数头文件,源文件。使用缓动函数的已知输入条件:总位移、移动的总时间、每次移动的时间间隔,缓动函数的输出为当前的总时间(已经移动的时间,若时间间隔相等,则为已经移动的次数*时间间隔,若时间间隔不等,则为已经运动的每次运行的时间的总和)应该移动的相对总位移的比例。所以本次的实际位移要用输出值乘以总位移,再减去已经运动了的位移。、

缺陷

本人在测试中发现,若缓动函数执行的时间间隔是固定的,那么在最后一次的执行中,很有可能实际剩余的位移数小于理论上这个时间间隔应该移动的位移,但是我们不能移动超过预期的目标值,所以会导致最后次移动时,位移数变小,那么速度就会比理论速度慢,若是选择的后面速度较大的缓动曲线,那么效果会很明显速度降低,暂时还没有想到解决办法,若有大神已有方案,欢迎指正!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值