AnimationEngine:在iOS上方便地构建高级自定义动画

AnimationEngine

INTUAnimationEngine从基于block的系统UIView动画API中获得灵感,提供了友好的使用CADisplayLink执行自定义动画的接口。它能够使交互式动画(通常由用户交互启动,比如平移或捏合手势)以给定的持续时间自动执行,也能够使动画在运行的每一帧都执行回调方法。

INTUAnimationEngine包括一个可用于定制动画时间曲线的easing(淡入淡出效果)函数扩展库和一个可以给Core Animation中不支持动画的属性添加动画的插值函数库。

此外,INTUAnimationEngine还具有一个独立的用于模拟物理学中阻尼简谐运动的弹跳动画库,被用来在INTUAnimationEngine内搭建一个阻尼、刚度、质量等参数完全可控的弹跳动画接口。由于SpringSolver(弹簧解算器)是纯粹由C语言编写的独立库,因此它不仅能在动画中使用,还可以在很多其它与动画无关的应用程序中单独使用。

安装

安装要求:iOS 5.0及以后

一、使用 CocoaPods 安装

1、在 Podfile 文件中添加:

2、在终端运行 pod install,然后通过工程中的 .xcworkspace文件打开应用程序。

3、导入 INTUAnimationEngine.h头文件:

二、单独安装SpringSolver(弹簧解算器)

INTUAnimationEngine中使用的弹簧解算器可以作为一个独立的C语言函数库在很多应用程序(包括与动画无关的应用程序)中使用。弹簧解算器有单独的CocoaPods命令行,可以与INTUAnimationEngine项目的其它部分分开单独安装。只安装弹簧解算器需要在Podfile中添加:

注意:使用 pod 'INTUAnimationEngine'安装INTUAnimationEngine时会自动将弹簧解算器作为依赖库一并安装。

三、从GitHub手动下载安装

1、从GitHub下载 INTUAnimationEngine文件夹 下的内容。

2、将所有的文件添加到你的Xcode工程中。

3、导入 INTUAnimationEngine.h头文件。

使用

INTUAnimationEngine和UIView动画方法的主要区别在于 animations block的工作方式。在UIView动画方法中, animations block只执行一次,而且block中给视图添加的改变代表动画结束时视图的状态;而在INTUAnimationEngine中, animations block会在动画运行期间多次执行(每帧一次),写在block中的代码应该根据回传到block中的 percentage or progress参数的当前值来实时更新视图状态。通常情况下,需要使用库中包含的插值函数为给定动画属性生成开始和结束状态之间的所有中间值。

一、启动动画

INTUAnimationEngine中有几个不同的接口方法来启动动画。

1、无淡入淡出(线性)

这个方法启动的动画将会每帧执行一次 animations block,并传入一个表示当前动画执行百分比的 percentage参数。动画结束时 completion block会被执行,并传入一个表示动画是否被取消的 finished参数。

2、有淡入淡出

这个方法启动的动画将会每帧执行一次 animations block,并传入一个表示当前动画执行进度(考虑淡入淡出效果)的 progress参数。参数 easingFunction可以是 INTUEasingFunctions.h文件中的任意淡入淡出函数,也可以是一个自定义淡入淡出曲线的block。动画结束时 completion block会被执行,并传入一个表示动画是否被取消的 finished参数。

上述方法还有一个增加了 options:参数的变体,该参数是 INTUAnimationOptions枚举类型的值,被用来定义动画是否重复或自动反转。

3、使用弹跳效果

这个方法启动的动画将会每帧执行一次 animations block,并传入一个表示当前动画执行进度的 progress参数。而且该动画会根据下面三个参数模拟弹簧简谐运动物理系统:

  • 阻尼:摩擦阻尼参数。必须大于或者等于0,如果等于0,简谐运动将无休止的持续下去。合适的取值范围:1.0〜30.0
  • 刚度:弹簧刚度系数。必须大于0。合适的取值范围:1.0〜500.0
  • 质量:弹簧质量参数。必须大于0。合适的取值范围:0.1〜10.0

需要注意的是,动画持续的总时间取决于由上述参数模拟的弹簧简谐运动物理系统到达静止状态的时间。动画结束时 completion block会被执行,并传入一个表示动画是否被取消的 finished参数。

二、取消动画

启动动画时可以存储返回的Animation ID,将其传递给上面的方法,可以在动画完成之前取消动画。如果动画被取消, completion block会被执行,而且 finished参数为NO。

三、Easing(淡入淡出)函数

INTUEasingFunctions.h是一个标准的easing(淡入淡出)函数库,这些函数的内部实现和动画演示在一个 便签 中可以查看。

四、插值函数

INTUInterpolationFunctions.h是一个标准的插值函数库。

1、近位插值

对于离散值(线性插值没有意义),有两个近位插值函数。例如:

2、线性插值

对于连续值,有许多线性插值函数。支持以下类型的值:

  • CGFloat
  • CGPoint
  • CGSize
  • CGRect
  • CGVector
  • UIOffset
  • UIEdgeInsets
  • UIColor / CGColor

还有一个隐式插值函数,该函数根据类型 id的值返回一个插值,并自动确定返回插值的类型。如果值的类型不匹配,或者线性插值函数不支持该类型,近位插值就会被使用。

3、CGAffineTransform 和 CATransform3D

由于原始数据的线性插值经常会产生意想不到的或者失去效用的结果,因此没有直接进行插值变换的函数。下面的代码是在两个变换之间进行插值,并将它们分解为平移、旋转和缩放:

可以通过以下代码组合变换:

4、UIColor 或 CGColor

在两个颜色之间进行插值时,必须保证这两个颜色的色彩模式(灰度、RGB或者HSB)相同。在HSB色彩模式下的颜色之间插值产生的视觉效果往往会比在RGB色彩模式下的颜色之间进行插值得到的视觉效果要更好。

五、Spring Solver(弹簧解算器)

工程中的 SpringSolver文件夹 包含了一个基于 Pop 弹簧解算器的弹跳物理效果库,用以模拟弹簧简谐运动。INTUAnimationEngine中的弹簧解算器经过大规模重构变得更加简洁、性能更高,而且作为一个完全独立的C语言库,具有更高的可移植性,还可以用于与动画无关的项目中。

示例工程

INTUAnimationEngine提供了一个 示例工程,示例工程运行要求:

  • Xcode版本6.0以上
  • iOS 6.0及以后

开源协议

INTUAnimationEngine在 MIT开源协议 下可以使用,也就是说,只要在项目副本中包含了版权声明和许可声明,用户就可以使用INTUAnimationEngine做任何想做的事情,而INTUAnimationEngine也无需承担任何责任。SpringSolver库(弹簧解算器)在 BSD开源协议 下可以使用。可以通过查看LICENSE文件来获取更多相关信息。

开源地址:https://github.com/intuit/AnimationEngine

打赏支持我整理更多优质资源,谢谢!

打赏编辑

打赏支持我整理更多优质资源,谢谢!

任选一种支付方式

2 2 收藏

资源整理者简介:魏川程



直接登录

推荐关注

按分类快速查找

关于资源导航
  • 伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1440 项工具资源。
    推送伯乐头条热点内容微信号:jobbole 分享干货的技术类微信号:iProgrammer