Android Lottie 使用以及源码解析
来源:互联网 发布:网络电视30天回看 编辑:程序博客网 时间:2024/05/17 04:53
Airbnb在GitHub上面开源了一个项目lottie-android,最近火的不要不要的,牢牢占据Trending排行榜(日、周、月)首位,下面我们就见识一下这个项目。
首先放上Lottie在GitHub上面的项目地址:Android,iOS, 和React Native。
Lottie简介
Lottie是一个为Android和IOS设备提供的一个开源框架,它能够解析通过Adobe After Effects 软件做出来的动画,动画文件通过Bodymovin导出json文件,就可以通过Lottie中的LottieAnimationView来使用了。
Bodymovin是一个After Effects的插件,它由Hernan Torrisi开发。
我们先看看官方给出的实现的动画效果:
这些动画如果让你实现起来,你可能会觉得很麻烦,但是通过Lottie这一切就变得很容易。
想了解更多请参考官方介绍
使用方法
首先由视觉设计师通过Adobe After Effects做好这些动画,这个比我们用代码来实现会容易的很多,然后Bodymovin导出json文件,这些json文件描述了该动画的一些关键点的坐标以及运动轨迹,然后把json文件放到项目的app/src/main/assets目录下,代码中在build.gradle中添加依赖:
- 1
- 2
- 3
在布局文件上加上:
- 1
- 2
- 3
- 4
- 5
- 6
或者代码中实现:
- 1
- 2
- 3
此方法将加载文件并在后台解析动画,并在完成后异步开始呈现动画。
Lottie只支持Jellybean (API 16)或以上版本。
通过源码我们可以发现LottieAnimationView
是继承自AppCompatImageView
,我们可以像使用其他View
一样来使用它。
- 1
甚至可以从网络上下载json数据:
- 1
- 2
- 3
- 4
或者使用
- 1
我们还可以控制动画或者添加监听器:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
LottieAnimationView
是使用LottieDrawable
来渲染动画的,如果有必要,还可以直接使用LottieDrawable
:
- 1
- 2
- 3
- 4
如果动画会被频繁的复用,LottieAnimationView
有一套缓存策略,可以使用
- 1
来实现它,CacheStrategy
可以是Strong
,Weak
或者是None
,这样LottieAnimationView
就可以持有一个已经加载和解析动画的强引用或者弱引用。
源码分析
下面我们就从LottieAnimationView
作为切入点来一步一步分析。
LottieAnimationView
LottieAnimationView
继承自AppCompatImageView
,封装了一些动画的操作:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
等等; LottieAnimationView
有两个很重要的成员变量:
- 1
- 2
LottieComposition
和LottieDrawable
将会在下面专门进行分析,他们分别进行了两个重要的工作:json文件的解析和动画的绘制。 compositionLoader
进行了动画解析工作,得到LottieComposition
。
我们看到的动画便是在LottieDrawable
上面绘制出来的,lottieDrawable
在setComposition
方法中被添加到LottieAnimationView
上面最终显示出来。
- 1
解析JSON文件
JSON文件
其实在 Bodymovin 插件这里也是比较神奇的,它是怎么生成json文件的呢?这个后面有时间再研究。解析出来的json文件是这样子的:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
重要的数据都在layers
里面,后面会介绍。
LottieComposition
Lottie使用LottieComposition
来作为存储json文件的对象,即把json文件映射到LottieComposition
,LottieComposition
中提供了解析json文件的几个静态方法:
- 1
- 2
- 3
- 4
- 5
- 6
其实上面这些函数最终的解析工作是在public static LottieComposition fromJsonSync(Resources res, JSONObject json)
里面进行的。进行了动画几个属性的解析以及Layer
解析。
下面看一下LottieComposition
里面的几个变量:
- 1
- 2
layers
存储json文件中的layers
数组里面的数据,Layer
就是对应了做图中图层的概念,一个完整的动画就是由这些图层叠加起来的,具体到下面再介绍。 layerMap
存储了Layer
和其id
的映射关系。
下面几个是动画里面常用的几个属性:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Layer
Layer
就是对应了做图中图层的概念,一个完整的动画就是由这些图层叠加起来的。 Layer
里面有个静态方法:
- 1
它解析json文件的数据并转化为Layer
对象,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
一些成员变量一一对应json文件layers
数组中的属性,动画就是由他们组合而来的。
数据转换
LottieDrawable
LottieDrawable
继承自AnimatableLayer
,关于AnimatableLayer
我们后面再分析。 AnimatableLayer
还有其他的子类,LottieDrawable
可以理解为根布局,里面包含着其他的AnimatableLayer
的子类,他们的关系可以理解为ViewGroup
以及View
的关系,ViewGroup
里面可以包含ViewGroup
以及View
。这部分暂且不细说,下面会详细介绍。 LottieDrawable
会通过buildLayersForComposition(LottieComposition composition)
进行动画数据到动画对象的映射。
会根据LottieComposition
里面的每一个Layer
生成一个对应的LayerView
。
LayerView
LayerView
也是AnimatableLayer
的子类,它在setupForModel()
里面会根据Layer
里面的数据生成不同的AnimatableLayer
的子类,添加到变量layers
中去。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
AnimatableLayer
AnimatableLayer的子类,分别对应着json文件中的不同数据:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
绘制
LottieDrawable
的animator
来触发整个动画的绘制,最终会调用LottieAnimationView
的public void invalidateDrawable(Drawable dr)
方法进行视图的更新和重绘。
绘制工作基本是由LottieDrawable
来完成的,具体实在其父类AnimatableLayer
的public void draw(@NonNull Canvas canvas)
方法中进行:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
先绘制了本层的内容,然后开始绘制包含的layers
的内容,这个过程类似与界面中ViewGroup
嵌套绘制。如此完成各个Layer
的绘制工作。
总结
由上面的分析我们得到了Lottie绘制动画的思路:
1. 创建 LottieAnimationView lottieAnimationView
2. 在LottieAnimationView
中创建LottieDrawable lottieDrawable
3. 在LottieAnimationView
中创建compositionLoader
,进行json文件解析得到LottieComposition
,完成数据到对象Layer
的映射。
4. 解析完后通过setComposition
方法把LottieComposition
给lottieDrawable
,lottieDrawable
在setComposition
方法中把Layer
转换为LayerView
,为绘制做好准备。
5. 在LottieAnimationView
中把lottieDrawable
设置setImageDrawable
,
6. 然后开始动画lottieDrawable.playAnimation()
。
- Android Lottie 使用以及源码解析
- Lottie源码简单分析以及使用
- Lottie动画库的使用 & 源码解析
- Lottie 源码解析(一)
- iOS-Lottie源码解析
- Android Lottie使用
- Lottie动画库 Android 端源码浅析
- lottie-android
- Android Lottie动画的简单使用
- Lottie Android 动画制作与使用
- Android开发——AsyncTask的使用以及源码解析
- Android开发----AsyncTask的使用以及源码解析
- AE制作json文件格式动画以及lottie开源库的使用
- android源码解析(5)--AsyncTask源码分析以及使用中的坑
- Android studio使用Lottie- 让Android动画实现更简单
- android inflater详解以及源码解析
- Volley的使用以及源码解析
- Lottie for Android
- day10--自我反省
- ValueAnimator实现动画
- 你有一条linux命令学习之chown
- zsh 命令(一)
- 加速度傳感器 G-sensor 10-bit, 3軸, 數字輸出加速度傳感器-BMA253
- Android Lottie 使用以及源码解析
- Lustre安装-Lustre2.10.0 Client安装-CentOS/RHEL(原创)
- 汉诺塔问题的递归解法与非递归解法(堆栈解法)
- mysql数据类型
- Junit框架的学习与使用
- 铝电解电容的尺寸
- Spark性能优化指南——高级篇
- 无敌是多么多么寂寞【操作系统FIFO及LRU算法C语言实现】
- 机器学习常见算法