目前移动端开发,现在的动画库差不多都需要手动去编写动画代码。这样的话,iOS 和 Android 开发者就需要分别去编写适合自己系统的代码。而且,手动编写动画的代码也非常复杂,不容易维护,很多动画细节的调整还需要和动画设计师不断沟通打磨,尤其是千行以上的动画代码编写、维护、沟通的成本巨大。
手动编写动画代码,除了会影响到开发者外,动画设计师也难以幸免。一款产品适配的平台越多,动画设计师设计走查的周期就越长,相应的动画成本就越高。同时,动画设计师很兴奋地设计出一套炫酷地动画效果后,在要通过开发者实现出来时,却因为工时评估过长而一再被简化,长此以往,动画设计师没有动力去设计动画效果。
为了解决这个问题,今天给大家介绍Lottie这个库
Lottie 框架就很好地解决了动画制作与开发隔离,以及多平台统一的问题。
Lottie 是 Airbnb 开源的一个动画框架。这个框架和其他的动画框架不太一样,动画的编写和维护将由动画设计师完成,完全无需开发者操心。
动画设计师做好动画以后,可以使用After Effects将动画导出成JSON文件,然后由Lottie 加载和渲染这个JSON文件,并转换成对应的动画代码。由于是JSON格式,文件也会很小,可以减少 App 包大小。运行时还可以通过代码控制更改动画,比如更改颜色、位置以及任何关键值。另外,Lottie 还支持页面切换的过场动画(UIViewController Transitions)。
如上图就是使用Lottie来加载的
首先动画设计师使用 After Effects 创作动画,然后使用 Bodymovin进行导出的,开发者完全不用做什么额外的代码工作,就能够使用原生方式将其渲染出来。
Bodymovin 是 Hernan Torrisi 做的一个 After Effects 的插件,起初导出的JSON文件只是通过 JavaScript 在网页中进行动画的播放,后来才将JSON文件的解析渲染应用到了其他平台上。
Bodymovin
使用Bodymovin,你需要先到Adobe官网下载Bodymovin插件,并在 After Effects 中安装。使用 After Effects 制作完动画后,选择 Windows 菜单,找到 Extensions 的 Bodymovin 项,在菜单中选择 Render 按钮就可以输出JSON文件了。
LottieFiles网站还是一个动画设计师分享作品的平台,每个动画效果的JSON文件都可下载使用。所以,如果你现在没有动画设计师配合的话,可以到这个网站去查找并下载一个 Bodymovin 生成的JSON文件,然后运用到工程中去试试效果。
在 iOS 中使用 Lottie
在iOS开发中使用Lottie也很简单,只要集成 Lottie 框架,然后在程序中通过 Lottie 的接口控制 After Effects 生成的动画 JSON 就行了。
首先,你可以通过 CocoaPods 集成 Lottie 框架到你工程中,在你的podfile中添加:pod 'lottie-ios', '~> 2.5.3' ,运行pod install。Lottie iOS 框架的 GitHub 地址是https://github.com/airbnb/lottie-ios/,官方也提供了可供学习的示例。
然后,快速读取一个由Bodymovin 生成的JSON文件进行播放。具体代码如下所示:
LOTAnimationView *animation = [LOTAnimationView animationNamed:@"8878-done"];
// 动画循环播放
animation.loopAnimation = YES;
animation.frame = CGRectMake(87.5, 100, 200, 200);
[self.view addSubview:animation];
[animation playWithCompletion:^(BOOL animationFinished) {
// Do Something
}];
LOTAnimationView继承自UIView,可以给它添加手势和frame,可以根据屏幕大小去做适配。
Lottie 还带有一个 UIViewController animation-controller,可以自定义页面切换的过场动画,示例代码如下:
#pragma mark -- 定制转场动画
// 代理返回推出控制器的动画
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
LOTAnimationTransitionController *animationController = [[LOTAnimationTransitionController alloc] initWithAnimationNamed:@"vcTransition1" fromLayerNamed:@"outLayer" toLayerNamed:@"inLayer" applyAnimationTransform:NO];
return animationController;
}
// 代理返回退出控制器的动画
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
LOTAnimationTransitionController *animationController = [[LOTAnimationTransitionController alloc] initWithAnimationNamed:@"vcTransition2" fromLayerNamed:@"outLayer" toLayerNamed:@"inLayer" applyAnimationTransform:NO];
return animationController;
}
多平台支持
Lottie 支持多平台,除了 支持iOS,还支持 Android 、React Native和Flutter。除了官方维护的这些平台外,Lottie还支持Windows、Qt、Skia 。陈卿还实现了 React、Vue和Angular对 Lottie的支持,并已将代码放到了GitHub上。
有了这么多平台的支持,对于动画设计师来说,可以安心做动画,只要简单地转换就可以完美展现动画效果,不用担心到开发者那里动画效果被大打折扣了。而对于开发者来说,不用写那些难以维护的大量动效代码了,而且App安装包的体积还变小了。
Lottie 实现原理
实际上,Lottie iOS在 iOS 内做的事情就是将 After Effects 编辑的动画内容,通过JSON文件这个中间媒介,一一映射到 iOS 的 LayerModel、Keyframe、ShapeItem、DashElement、Marker、Mask、Transform 这些类的属性中并保存了下来,接下来再通过 CoreAnimation 进行渲染。这就和你手动写动画代码的实现是一样的,只不过这个过程的精准描述,全部由动画设计师通过 JSON文件输入进来了。
Lottie iOS 使用系统自带的 Codable协议来解析JSON文件,这样就可以享受系统升级带来性能提升的便利。
Lottie 就是通过 Codable协议定义了一系列的类结构,可以将JSON数据全部映射过来。所有映射用的类都放在 Lottie 的 Model 目录下。使用 CoreAnimation 渲染的相关代码都在 NodeRenderSystem 目录下,进而实现动画效果。
如果是手写动画,这些代码就需要不断重复地写。使用第三方库去写动画的话,也无非就是多封装了一层,而属性的设置、动画时间的设置等,还是需要手动添加很多代码来完成。
但是,使用 Lottie 后,你就完全不用去管这些代码了,只需要在 After Effects 那设置属性、控制动画时间就好了。
Lottie 这样的工作流程或许就是未来的趋势,就像 iOS 现在的发展趋势一样,越来越多的业务逻辑不再需要全部使用 Objective-C 或 Swift 来实现了,而是使用JavaScript 语言或者 DSL 甚至是工具来描述业务,然后将描述业务的代码转换成一种中间代码,比如 JSON,不同平台再对相同的中间代码进行解析处理,以执行中间代码描述的业务逻辑。
这样做不仅可以减轻 App 包的大小,实现多端逻辑的统一处理,还可以让团队分工更加明确,一部分人专门开发业务代码,另一部分人负责端内稳定性、质量把控、性能提升工作的建设。