Lottie 已经有好多人分析了,但是我看到源码差不多都是刚出来的时候的,最近又看了一遍源码,参考:https://www.jianshu.com/p/97d5daa37a15
一、时序图
如果这个图看不清,可以直接去这个链接查看:https://www.processon.com/view/link/6114c6245653bb6d0a7878aa
二、笔记
分析的时候记的笔记有点混乱,有时间再整理
先从 LottieAnimationView 方法的一层层的调用看起:
LottieAnimationView.
setAnimationFromJson(String, String)
setAnimation(InputStream stream, @Nullable String cacheKey)
setCompositionTask(LottieCompositionFactory.fromJsonInputStream(stream, cacheKey));
LottieCompositionFactory.
fromJsonInputStream(stream, cacheKey)
//...然后一路找下去
//最终会走到 LottieCompositionFactory.fromJsonReaderSyncInternal 方法
private static LottieResult<LottieComposition> fromJsonReaderSyncInternal(
com.airbnb.lottie.parser.moshi.JsonReader reader, @Nullable String cacheKey, boolean close) {
// 从json文件加载一个composition
LottieComposition composition = LottieCompositionMoshiParser.parse(reader);
// 判断是否进行缓存
if (cacheKey != null) {
LottieCompositionCache.getInstance().put(cacheKey, composition);
}
return new LottieResult<>(composition);
// ...省略了部分代码
}
// LottieComposition 可以看作是一个包含所有图层动画信息的对象
// 具体的parse方法就是根据每层的names给composition对象设置属性
// 使用LottieCompositionMoshiParser.parse(JsonReader reader)方法
switch (reader.selectName(NAMES)) {
case {
0..10}
// 看下NAMES对应的json中的键名,就是前面分析出的json文件格式
JsonReader.Options NAMES = JsonReader.Options.of(
"w", // 0
"h",