聊聊动画引擎 pop

iOS可以通过CADisplayLink实现自定义动画引擎,pop就是基于此实现的,而且比原生Core Animation更强大好用。譬如当ViewController侧滑返回的时候,系统会将Core Animation的动画会停止,而基于CADisplayLink实现的动画则不会停止,因而可以实现类似网易云音乐从播放页侧滑时hold住专辑封面图旋转的效果。

八一八魔性的pop

1、实用的宏

2、判定值的数据类型

pop定义了支持的值的数据类型

通过@encode指令,将给定类型编码的内部字符串与objcType对比,得到值的数据类型

3、将值的数据类型标准化为Vector

举个CGRect类型的例子:

通过Vector的两个参数size_t _count;CGFloat *_values;将给定的类型抽象出来,实现解耦。此外还有一个好处,当创建属性动画为kPOPLayerBounds,但toValue属性赋值的是一个NSNumber,得益于_values是数组指针,并不会引发数组越界导致的crash,只是动画效果不可预期。

4、基于NSRunLoop的动画更新机制

在主线程RunLoop中添加观察者,监听了kCFAllocatorDefaultkCFRunLoopBeforeWaitingkCFRunLoopExit事件,在收到回调的时候,处理_pendingList里的动画。

5、更新动画的回调数组

封装不同的动画行为,实现类似模板模式,只需统一调用,即可更新动画

6、动画插值的动态实现

可以看出总共有四种动画插值的算法,以kPOPAnimationBasic为例:

依照给定的timingFunction,使用POPTimingFunctionSolve计算贝塞尔曲线的变化率,再通过混合计算#define MIX(a, b, f) ((a) + (f) * ((b) - (a))),最终得到动画的插值。

小结

pop中还有很多有意思的地方,譬如TransformationMatrix里的矩阵操作,这里就暂且不挖WebCore底层了。简而言之,无论性能(c++混编)、易用、容错,pop都有着作为引擎该有的特性,而它所暴露的和Core Animation相似的接口也让人极易上手!

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

2 4 收藏 评论

关于作者:Hawk0620

喜欢新奇事物,爱探索和冒险,用艺术的视角欣赏技术,也迷恋篮球和音乐。 个人主页 · 我的文章 · 2 ·  

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部