最近研究了一下React Native的动画实现方案,大概有这几种:
1. React Native内置动画
其中主要分为两类:Animated
用于创建精细的交互控制的动画,LayoutAnimation
用于全局的布局动画。
不过Animated仅封装了四个可以动画化的组件:View、Text、Image和 ScrollView,当然你也可以自己封装你自己的动画组件。
同时他还支持多个动画的组合,包括parallel(多个动画同时执行)、sequence(多个动画顺序执行)、stagge(多个动画过程中每隔一个延迟时间执行下一个)和delay(延时执行)。
应该说React Native提供的动画API其实还是比较丰富的。
但是,不要低估设计同学对动画的想象力,对于一个比较大型的App来说仅仅依靠这些,通常是没法满足要求的。所以,很多时候就需要依靠第三方库了。
2. react-native-animatable
一个start数超过6000的动画库。可以实现一些比较复杂的常规动画。例如:3.lottie-react-native
lottie是airbnb推出的一个动画库,它可以让设计师通过插件,将ps设计好的动画直接导出成为json文件,然后通过在客户端集成lottie库,直接将json解析成动画,绘制出来。大大简化了动画的实现难度和开发的工作量。不过有时从ps直接导出的动画和在客户端上的显示效果有差异,可能需要设计师调整设计方案,因此将原来客户端的一些工作量转移到了设计师身上,不过总体来说还是利大于弊。
lottie也提供了一套RN的实现方案,让你的动画轻松实现。
除了这些常规的动画方案,还有一些游戏引擎,也能实现动画。他们因为采用直接绘制的方案,有时在性能上会有很大的改善。不过在实现上,可能需要更多的工作量。
4.gl-react-native-v2
将opengl es进行了封装,通过RN提供了接口对外暴露。不过基本上已经停止更新,绝大多数代码已经2-3年没有动过了。提供了比较基础的opengl es的功能,对于要求不高的用户来说,可以尝试。不过在android上有bug,无法设置背景为透明,这样会导致通过OpenGL es绘制出来的内容都是黑色的背景。作者已经将下面这个库来替换这个库了。
5.react-native-webgl
将webgl通过RN接口对外暴露。实现了webgl的绝大多数接口和功能。不过对于客户端开发来说,webgl开发还是有比较大的难度的。这个代码实际来源于expo,作者本意是想着将expo的webgl部分代码更新实时同步到react-native-webgl中,不过理想是美好的,现在react-native-webgl也已经有两年没有更新了。
6. react-native-unity-view
将unity封装成一个view对外暴露出很多接口,可以让RN直接使用。
7.react-native-cocos2dx
cocos2dx的RN封装,不过看start和下载数量,使用的人应该不多,而且我是用最新的RN版本,折腾了半天也没有把他配置好。而且需要更改RN中的一些代码。并且两年多没有更新了,如果要使用可能需要折腾一番才能。
当然,还有一些更重一点的定制化游戏RN引擎,例如react-game-kit或者react-native-game-engine,或者阿里也开源了几个方案GCanvas、G3D和BindingX,但是没太研究过,毕竟去年才出现阿里开源库的圣诞节雪花事件。
除了上面1,2,3那几个库,其他的几个库配置起来真的各种坑,再次吐槽一下react native以及各种库的版本兼容。
其实我自己最开始只是想要找一个可以顺序播放图片的动画库,找了一下,stackoverflow上已经有了答案,不过实际播放效果并不好,主要是因为RN中图片的解析是异步的,而且没有缓存,所以快速切换显示图片的时候,经常会出现图片解析顺序和你所期望的播放顺序不同,或者有时直接就出现短暂的白屏。因此才期望寻找一种简便、高效的实现方案,可惜到现在也没有找到。