Lottie是是一个可以解析Adobe After Effects使用BodyMovin插件导出的动画json文件,并且渲染到手机和网页上的库,Lottie支持Android,iOS,Web和Windows。
Lottie在Android仅支持Gradle的形式依赖,需要在你的build.gradle
中添加以下的依赖
dependencies {
...
implementation "com.airbnb.android:lottie:$lottieVersion"
...
}
到目前为止最新的版本是: 3.1.0
Lottie支持API 16以上,也就是android 4.1以上。
src/main/res/raw
目录下的json动画文件src/main/assets
目录下的json动画文件src/main/assets
目录下的zip文件InputStream
这是最简单的方式,推荐使用lottie_rawRes
,因为你可以通过资源引用来使用静态的动画文件。
所有的Lottie的动画都默认使用了LRU
缓存机制。这个是2.6.0版本更改的,之前的版本是用Strong/WeakRef实现的。
你可以控制动画或者增加监听器:
animationView.addAnimatorUpdateListener((animation) -> {
// Do something.
});
animationView.playAnimation();
...
if (animationView.isAnimating()) {
// Do something.
}
...
animationView.setProgress(0.5f);
...
在监听的代码中,你可以通过animation.getAnimatedValue()
来获取当前动画的进度,不论是否设置了最大/最小的帧[0,1]。animatin.getAnimatedFraction()
将会返回你设置大小的进度。
大部分情况下,直接使用playAnimation()
即可,一些特殊的case,你也可以使用setProgress(...)
来启动滑动,例如:
// Custom animation speed or duration.
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
animator.addUpdateListener(animation -> {
animationView.setProgress(animation.getAnimatedValue());
});
animator.start();
Lottie支持重复播放,你可以使用setRepeatMode(...)
或者setRepeatCount(...)
,或者在xml中使用lottie_loop="true"
。
Lottie将所有的px值转换为dp值,这样就能保证在所有的设备上的大小是一致的。如果你的动画尺寸不是完美的,你可以有以下两个选择:
LottieAnimationView
继承自ImageView
,它同样支持centerCrop
和centerInside
两个属性LottieAnimationView
和LottieDrawable
都有setScale(float)
的API函数,PS:如果缩小你的动画,也可以减少每帧需要绘制的大小,也就是会提升性能。你可以在运行时动态的更新属性,这个可以帮你完成很多需求:
图层的概念与Photoshop中的图层概念类似:图层是对整个动画进行了更细粒度的区分,将不同的类型元素进行了拆分,将不同的形状、纯色、文本等元素分别分配到不同的图层中,所有图层依序叠加在一起构成了所渲染的图像。在未与其他图层关联时,修改某一图层的属性不会影响到其他图层,这样在执行动画的时候可以更加清晰的对各个元素执行不同的动画逻辑。
public enum LayerType {
PRE_COMP,
SOLID,
IMAGE,
NULL,
SHAPE,
TEXT,
UNKNOWN
}
动画的单位是帧,预先设定初始值和目标值,在一段时间内不断改变这个值向目标靠近,这个初始值和目标值就可以认为是关键帧,在这之间可以插入多个关键值,这样就会有多个关键帧了。
{
"v": "4.10.1", //版本号
"fr": 25, // 帧率
"ip": 0, // 首帧
"op": 106, //尾帧
"w": 1920, //宽
"h": 1080, //高
"nm": "Comp 1", //名称
"ddd": 0,
"assets": [], //图片集合
"fonts": {...}, //字体
"layers": [
{
"ddd": 0,
"ind": 1, //图层id
"ty": 4, //图层类型index-shape
"nm": "perki Outlines", //图层name
"sr": 1, //transform
...
核心类:
LottieAnimationView
继承自AppCompatImageView
,通过它加载展示各种动画LottieComposition
通过生成LottieCompositionFactory
解析json文件,转换成Java数据对象LottieDrawable
负责绘制逻辑LottieDrawable.draw()
-> CompositionLayer.draw()
-> Layers.draw()
LottieAnimationView.playAnimation
-> LottieDrawable.playAnimation
-> LottieValueAnimator.playAnimation
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override public void onAnimationUpdate(ValueAnimator animation) {
if (compositionLayer != null) {
compositionLayer.setProgress(animator.getValue());
}
}
});