动画惯性

效果

收下来和展开会有一个惯性的效果,这个使用QPropertyAnimation可以实现的,是通过设置setEasingCurve来实现的

我们来看看这个函数,传参是传QEasingCurve的类型,根据官方文档的介绍,QEasingCurve类提供用于控制动画的缓动曲线,我们上面效果的动画就是有现成的缓动曲线,QEasingCurve总共支持一下的缓动曲线

这些缓动的效果帮助文档都写有相关的曲线,下面我们结合这个例子来看一下

上面的例子我们使用到了InBack和OutBack两种。

代码

m_maxRect = QRect(0, 12, 48, 438);
m_middleRect = QRect(0, 150, 48, 300);
m_minRect = QRect(0, 384, 48, 66);m_pAnimal = new QPropertyAnimation(this, "geometry", this);
m_pAnimal->setDuration(1000);m_pAnimal->setStartValue(m_maxRect);
m_pAnimal->setEndValue(m_middleRect);
m_pAnimal->setDirection(m_middleDirection);
if(m_middleDirection == QPropertyAnimation::Forward) {m_pAnimal->setEasingCurve(QEasingCurve::OutBack);m_middleDirection = QPropertyAnimation::Backward;m_pAnimal->setDuration(800);
}
else {m_pAnimal->setEasingCurve(QEasingCurve::InBack);m_middleDirection = QPropertyAnimation::Forward;m_pAnimal->setDuration(1100);
}

这里只贴出部分代码,向下收起使用的是OutBack,向上展开使用的是InBack

我们来看这两种的曲线:

对于OutBack,纵坐标value相当于动画设置的属性值,我们例子中就是geometry值,当纵坐标的值从小到大变化时,后半部分的值会比最终值大再变成最终值。例子中点击收起来的时候,geometry的y值是从小到大变化的,最后比有一段往下沉的动画再回到最终设定的位置。

对于InBack曲线,同样的,当纵坐标的值从小到大变化时,一开始会有一部分小于初始值,最后变成最终值;反过来看,就是从最终值回到初始值,在回到初始值之前值会比初始值小。例子中点击展开的时候,y值是从大变小的,所以我们要反过来看,就是回到初始值之前会有向上伸出的效果,就是y值要比初始值小。

所以我们选用曲线的时候,要看我们的属性值是从小到大变化还是大到小变化,根据曲线来选我们想要的缓动效果

相关的Qt官方例子:

1.animatedtiles

2.blurpicker

动画组

上面的动画效果中,我们看到展开的时候,上面的三个按钮是逐步显现出来的,这个效果就是用到动画组,串行动画组QSequentialAnimationGroup,就是多个动画逐步执行。

代码

//串行动画组m_pBtnShowAnimal = new QSequentialAnimationGroup(this);QList<QAbstractButton*> btnList = m_pBtnGroup->buttons();for(int i = 2; i >= 0; --i) {QAbstractButton *btn = btnList.at(i);QPropertyAnimation *btnAnimal = addBtnHideAnimal(btn, btn->pos());m_pBtnShowAnimal->addAnimation(btnAnimal);}QPropertyAnimation * MainWindow::addBtnHideAnimal(QWidget *item, QPoint pos)
{QPropertyAnimation *animation = new QPropertyAnimation(item, "geometry", this);animation->setDuration(200);animation->setStartValue(QRect(qobject_cast<QWidget *>(item->parent())->width()/2,         item->y() + item->height()/2, 0, 0));animation->setEndValue(QRect(pos, item->size()));return animation;
}

执行的循序和添加的循序一样,用法很简单。

与串行动画组相对应的是并行动画组QParallelAnimationGroup

动画过程

效果

代码

m_pBtnStopAnimal = new QPropertyAnimation(m_pBtnGroup->button(6), "geometry", this);m_pBtnStopAnimal->setDuration(800);QRect originRect = m_pBtnGroup->button(6)->geometry();m_pBtnStopAnimal->setKeyValueAt(0, originRect);m_pBtnStopAnimal->setKeyValueAt(0.2, QRect(originRect.x() - 6, originRect.y() - 6,originRect.width() + 12, originRect.height() + 12));m_pBtnStopAnimal->setKeyValueAt(0.6, QRect(originRect.x() - 6, originRect.y() - 6,originRect.width() + 12, originRect.height() + 12));m_pBtnStopAnimal->setKeyValueAt(0.7, originRect);m_pBtnStopAnimal->setKeyValueAt(0.9, QRect(originRect.x() - 3, originRect.y() - 3,originRect.width() + 6, originRect.height() + 6));m_pBtnStopAnimal->setKeyValueAt(1, originRect);static int animalcout = 0;connect(m_pBtnStopAnimal, &QPropertyAnimation::finished, this, [=](){++animalcout;//执行2次if(animalcout < 3){QThread::msleep(300);m_pBtnStopAnimal->start();}else {animalcout = 0;}});

这个效果我们使用的是setKeyValueAt给动画设定更细的步骤,区别于一般的设置初始值和最终值,动画效果是按钮变最大,有个停顿的时间,回到初始大小,又变到稍微大,最后回到初始大小这么一个效果,就是这么几个过程,其中变到最大停顿一下,通过设定连续两个状态0.2和0.6都是最大状态,那这部分时间都会维持最大的状态,看起来就像停顿了一下。

结尾

一个小小的例子用到qt动画的很多东西,还是有一定的参考价值的。

完整的代码可到我的csdn资源下载处下载

下载地址

【Qt】动画使用及惯性效果相关推荐

  1. qt动画效果_Qt编写自定义控件44-天气仪表盘

    一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...

  2. Qt动画与Qt坐标小记

    Qt动画 转载自:  <http://jingyan.baidu.com/article/154b46315757b628ca8f4116.html> 和   <http://blo ...

  3. 仿iphone原生短信滑动时惯性效果

    如果又细心的朋友会发现,iphone的自带短信息的信息列表在拖拽滑动的时候,每一个cell会有惯性的动画效果,这个我也是从网上找到一些资料,最后知道早在2013年苹果就对这个进行了设计,大家看看这个h ...

  4. Qt Quick里的图形效果——颜色(Color)

    Qt Quick提供了通过改变一个 Item 的颜色来产生各种各样效果的元素.有下面几种: BrightnessContrast,调整亮度和对比度 ColorOverlay,在源 Item 上覆盖一层 ...

  5. Qt Quick里的图形效果——渐变(Gradient)

    Qt Quick提供了三种渐变图形效果: ConicalGradient,锥形渐变 LinearGradient,线性渐变 RadialGradient,径向渐变 效果 下图是我设计的示例效果: 图 ...

  6. 使用Qt动画框架设计角色的二维动画

    使用Qt动画框架设计角色的二维动画 Qt的动画框架是Qt4.6新添加的一个重要的特性,有了它,开发人员可以制作激动人心的动画界面,而不必局限于单调的固定窗口了,可以说,Qt动画框架是其它界面库少见的功 ...

  7. Qt动画框架The Animation Framework

    一个网友翻译的,没有翻译完,我把剩下的那部分翻译出来贴出来 动画框架是Kinetic(运动)项目的一部分,它的目标是提供一中简单的方法创建动画的和流畅的GUI.借助Qt动画属性,可以提供非常自由的动画 ...

  8. WPF Multi-Touch 开发:惯性效果(Inertia)

    从上一篇实例可以发现在图片移动过程中如果将手指移开屏幕则图片会立刻停止,根据这种情况WPF 提供另外一种惯性效果(Inertia).通过它可以使UI 单元移动的更加符合物理特性.更为实际和流畅. 在前 ...

  9. Qt 实现钢笔画线效果详细原理

    前言 上一篇文章:Qt 实现画线笔锋效果详细原理,根据这篇介绍的实现笔锋效果的原理,我们很容易实现另外一种笔效:钢笔. 所谓的钢笔笔效,就是真实还原钢笔书写出来的线条效果,其特征就是:根据笔的绘制速度 ...

  10. Qt动画框架Animation Framework

    Qt动画框架 Qt动画框架 动画架构 动画框架中的类 动画Qt属性 动画和图形视图框架 缓和曲线 将动画放在一起 Qt动画框架 动画框架旨在为创建动画和平滑的GUI提供一种简便的方法.通过对Qt属性进 ...

最新文章

  1. Python学习之路--函数
  2. Product ID Not in valid range
  3. .NET Core 容器化调查
  4. php 字符符转整数
  5. android学习笔记30——AndroidMainfest.xml
  6. 二级指针做输入_第2种内存模型
  7. 忍者神龟java_忍者神龟-邪恶重生
  8. java格式手机软件和国产mrp_国产-山寨-杂牌手机如何安装软件【MRP格式】
  9. 关于将Tesorflow的SavedModel模型转换成tflite模型
  10. JavaScript基础若干盲点总结
  11. 51单片机--时钟芯片ds1302
  12. flex: 1到底是什么意思?
  13. 用上就不会停下的效率利器—Automator
  14. 亚瑟阿伦的三十六个问题。
  15. RabbitMQ的四种交换机模式
  16. ios ZXing 二维码、条形码扫描
  17. HDU1431 素数回文(打表)[C,C++,Java]
  18. WPF MVVM设计模式下 相同Xaml绑定不同ViewModel问题
  19. 【表白神器】Python超火隐藏表白图 你能看出来吗?【附源码】
  20. 好用的手机投屏电脑软件

热门文章

  1. 用计算机制作演示文稿教案博客,《制作多媒体演示文稿》教学案例
  2. 实战:第十五章:摸爬滚打这些年的心路历程
  3. java虚无世界_我的世界1.7.10工业虚无整合包
  4. C# Key Value列表
  5. 转行测试,11k入职,我写了份1000多字的分享,每一笔都是经历
  6. qzezoj 1641 黑暗城堡
  7. 虚拟机无法重启服务器,windows2019虚拟机管理服务无法启动
  8. 关于个人的年度小目标
  9. ios addressbook
  10. Chrome浏览器断网时的小恐龙dino怎么一直玩?