首先来思考一下如何实现下面的动画

Android SeekBar动画 android lottie动画_Android SeekBar动画

Android的动画有很多种:

Frame Animation(逐帧动画):

主要用于播放一帧帧准备好的图片,类似GIF图片。

Tween Animation(补间动画):

补间动画就是我们只需指定开始、结束的“关键帧”,而变化中的其他帧由系统来计算,不必自己一帧帧的去定义。

Property Animation(属性动画):

属性动画,这个是在Android 3.0中才引进的,它可以直接更改我们对象的属性。在上面提到的Tween Animation中,只是更改View的绘画效果而View的真实属性是不改变的。

那么到底要用哪一种动画来实现呢?下面开始进入正题。

1.介绍

要实现上面的动画,可以使用lottie,lottie虽然不属于上述的三种动画,但却可以实现上面的效果。那么到底什么是lottie?

Lottie是一个iOS,Android和React Native库,可以实时渲染After Effects动画,并且允许本地app像静态资源那样轻松地使用动画。Lottie使用名为Bodymovin的开源After Effects的扩展程序导出的JSON文件格式的动画数据。

Android SeekBar动画 android lottie动画_json_02

实现动画的方式有很多种,那我们为什么要用lottie呢

2.示例

Android SeekBar动画 android lottie动画_json_03

如果用传统的方法实现上图的动画,是不是想死的心都有了,但是用lottie来实现的话,可能只需简单的几行代码。多简单呢?

LottieAnimationView anima tionView = (LottieAnimationView) findViewById(R.id.animation_view);
animationView.setAnimation("hello-world.json");
animationView.loop(true);
animationView.playAnimation();

没错就是这么简单。

暂时不看代码,先看看lottie的原理

Lottie使用json文件来作为动画数据源,json文件是通过 Bodymovin 插件导出的,查看sample中给出的json文件,其实就是把图片中的元素进行来拆分,并且描述每个元素的动画执行路径和执行时间。Lottie的功能就是读取这些数据,然后绘制到屏幕上。

现在思考如果我们拿到一份json格式动画如何展示到屏幕上。首先要解析json,建立数据到对象的映射,然后根据数据对象创建合适的Drawable绘制到View上,动画的实现可以通过操作读取到的元素完成。

Android SeekBar动画 android lottie动画_Android SeekBar动画_04

如何使用lottie?

1.安装After Effects

Android SeekBar动画 android lottie动画_android_05

Android SeekBar动画 android lottie动画_json_06

Android SeekBar动画 android lottie动画_android_07

有了json文件之后,我们就可以写代码了

在build.grdle中引入依赖

dependencies {
compile 'com.airbnb.android:lottie:2.1.0'
}

布局文件中添加LottieAnimationView

android:id="@+id/animation_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:lottie_fileName="data.json"
app:lottie_loop="true"
app:lottie_autoPlay="true" />

在app/src/main/目录下创建文件夹assets,吧刚才的json文件放进去

Android SeekBar动画 android lottie动画_Android SeekBar动画_08

然后播放动画

LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.animation_view);
animationView.setAnimation("data.json");
animationView.loop(true);
animationView.playAnimation();

更多属性、方法

监听动画播放进度:animationView.addAnimatorUpdateListener()

是否循环播放:animationView.loop()

自定义速度与时长:ValueAnimator.ofFloat(0f,1f).setDuration(500)

播放动画:animationView.playAnimation()

停止播放:animationView.cancelAnimation()

网络请求json:

Android SeekBar动画 android lottie动画_lottie动画android_09

内存占用

1.如果没有mask和mattes,那么性能和内存非常好,没有bitmap创建,大部分操作都是简单的cavas绘制。

2.如果存在mattes,将会创建2-3个bitmap。bitmap在动画加载到view时被创建,被view删除时回收。所以不宜在RecyclerView中使用保函mattes或者mask的动画,否则会引起bitmap抖动。

3.如果在列表中使用动画,推荐使用缓存

优点

1.跨平台支持ios,android,react native

2.从代码上看,Android端的实现是基于Drawable、ios端是基于layer,最终都是对canvas操作,中间除去解析json外,基本没有耗费性能的行为

3.动画由json文件描述,占用空间不多

4.支持服务端url方式创建。所以可以通过服务端配置json文件,随时替换客户端的动画,不用通过发布版本就可以做到。

5.设计师的成果可以最大程度得到实现。

6.开发成本低。

仍然存在的问题

1.bodymovin插件待完善

2.目前不支持文字,所有文字必须转为矢量图才能正常展示动画

3.动画无法被编辑,即移动端无法更改远端下载到本地的动画

4.只支持AE导出来的特定格式文件

总结

以往实现复杂的动画效果是一个让人头痛的问题,现在有了lottie,无论多复杂的动画都可以交给设计师去处理。开发所需要做的只是添加一个view,然后播放动画。