如何使用框架开发的好处Android动画开发框架Lottie

Lottie动画在Android和Ios开发中的应用——Ios篇
Lottie动画在Android和Ios开发中的应用——Ios篇
编辑:www.fx114.net
本篇文章主要介绍了"Lottie动画在Android和Ios开发中的应用——Ios篇",主要涉及到Lottie动画在Android和Ios开发中的应用——Ios篇方面的内容,对于Lottie动画在Android和Ios开发中的应用——Ios篇感兴趣的同学可以参考一下。
Lottie动画是airbnb最新开源的一个动画解决方案,在移动平台使用非常便捷,无论,,还是Web都支持。
先来看一下他能做的效果
这是官方上传到github上的Ios Demo
里面展示了三个方面
一、各种单独动画的展示
二、输入法字母的动画
三、两个页面之间的切换动画
有兴趣的同学,可以直接下载demo运行
我们来看一下怎么能在我们项目中应用Lottie动画
当然,首先你得有动画的文件,这个官方demo里有很多,可以直接用,也可以自己用AE制作一个导(安装插件Bodymovin)出来使用。
Lottie库支持用pod直接导入
pod 'lottie-ios'
pod install
再代码中使用LOTAnimationView
LOTAnimationView *animation = [LOTAnimationView animationNamed:@&Lottie&];
[self.view addSubview:animation];
动画名称,不需要后缀名.json
另外,动画可以获取时间,播放进度,播放速度,循环播放等参数,当然也可以设置这些参数
如:animationDuration animationProgress animationSpeed loopAnimation pause play
playWithCompletion 监听播放完毕动画的时机
可是我想播放编辑的图片的动画,android里就可以,而ios里没找到怎么设置,也没在demo里找到对应事例,
难道ios和android支持的还不一样么?
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:Lottie- 让Android动画实现更简单 - 简书
Lottie- 让Android动画实现更简单
Lottie是什么?
Lottie是Airbnb开源的一个支持 Android、iOS 以及 ReactNative,利用json文件的方式快速实现动画效果的库。这么看可能很难理解,接下来我将详细的讲解如何使用。Lottie项目地址:
首先先无耻的把我自己写的demo程序和源码放上来。
Demo体验apk下载地址:
Demo程序的github地址 :
Lottie如何使用?
一、Lottie能干什么?
在回答Lottie能干什么之前,我们先想下如下的动画如何实现?
如何实现上方的动画效果?
我想大概有几种方式:
使用帧动画。这种方式固然可行,但是一个需要动画添加很多张图片,势必会导致apk体积变大,并且还要根据不同的尺寸进行适配。
用 Gif。但是使用 Gif 占用空间较大,而且需要为各种屏幕尺寸、分辨率做适配,并且Android本是不支持gif直接展示的。
用代码加图片辅助。如之前写的 ,这种方式繁琐并且每更新一次都需要重新写很多代码。
Android 5.x 之后提供了对 SVG 的支持,通过 VectorDrawable、AnimatedVectorDrawable 的结合可以实现一些稍微复杂的动画,但是问题和前2个类似。
那么有没有什么方式是即可以方便的实现动画效果,又可以不用考虑适配的问题,而且Android、ios还可以兼容呢?
Lottie就是支持Android, iOS, 和React Native,并且只需简单的代码就可以实现复杂动画效果的库
二、Lottie在Android端怎么用?
假设我们要做一个缓冲数据时的一个loading动画,不用Lottie之前你们公司的美工一般都会给一个gif动画效果和一些切好的一帧一帧的图片。现在不需要这么操作了,只要你们公司的美工做如下的操作:
下面是公司帅帅的美工的工作
让设计师使用Adobe 的 After Effects(简称 AE)工具(美工一般都会这个)制作这个动画。AE的下载地址:链接:
密码:f2t7
(安装破解什么的就自行百度吧)
在AE中安装一个叫做Bodymovin的插件。下载
,解压缩后只需要\build\extension\bodymovin.zxp这个档案就可以
-9003-svgani1
3.手动安装plugin,以windows系统而言,要先下载
并解压缩。再来把下载的bodymovin压缩后的 bodymovin-master\build\extension 目录下的bodymovin.zxp 这个档案复制进去同一个资料夹。
-7754-svgani3
4.去找cmd,并以系统管理员身分执行。
-9310-svgani4
5.打“cd C:/ExManCmd_win 所在的路径 “,进入ExManCmd的资料夹中
-6123-svgani5
ExManCmd.exe /install bodymovin.zxp
-7665-svgani6
7.再来进入AE 后,可以在windows/extentions/bodymovin 找到插件,开启后按下Render 就完成了。 重点来了,这时会在你选的Destination Folder目录中生成一个json格式的文件,这个 json 文件描述了该动画的一些关键点的坐标以及运动轨迹。请帅帅的美工把这个文件发给你苦逼的程序员兄弟吧!
-4251-svgani7
下面就是苦逼Android程序员应该如何做咯
1.在build.gradle中添加
dependencies {
compile 'com.airbnb.android:lottie:1.0.1'
2.layout文件中添加
&com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:lottie_fileName="hello-world.json"
app:lottie_loop="true"
app:lottie_autoPlay="true" /&
3.将帅帅的美工给你的json文件重命名为xml中lottie_fileName的值,如上就是hello-world.json。将hello-world.json放入 app/src/main/assets目录中。打包吧!!
然后你就会发现奇迹出现了,没有一张图片,没有一个gif,但是动画效果出来了!就是这么简单,就是这么暴力!
三、Lottie进阶,如何更加高效和方便的实用?
1.最简单的使用方式就是上方直接在xml中定义的方式。2.使用代码的方式,支持从assets目录中直接读取json文件、json字符串的方式、stream流的方式等
Paste_Image.png
3.从网络获取json文件,直接显示动画。这种方式很炫,你就可以不用不更新apk就不动声色的定期更新你的动画了。下方是我写的一个小demo,使用okhttp访问网络上一段json文件,然后显示动画。
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
@Override public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
JSONObject json = new JSONObject(response.body().string());
LottieComposition.fromJson(getResources(), json, new LottieComposition.OnCompositionLoadedListener() {
public void onCompositionLoaded(LottieComposition composition) {
setComposition(composition);
} catch (JSONException e) {
四、Lottie例子程序
为了更好的让你了解这个库,我写了一个简单的demo,请大家帮忙点star
Demo体验apk下载地址:
Demo程序的github地址 :
感谢以下文章:Android 框架分析(1)
Lottie是什么?
今天接手一个新项目的时候发现以前的同事引入了Lottie库,因为之前没有接触过后来百度了一下发现原来这个库主要是用来实现一些比较复杂的动画的。下面是官方的介绍,Lottie是Airbnb开源的一个支持Android、ios以及ReactNative,利用json文件的方式快速的实现动画效果的库,接下来就介绍一下它的如何使用的。
最开始我们就去github上看看它的源代码以及Demo:
以前我们在实现动画的时候一般都有以下几种方式:
使用帧动画。这种方式就是多张图片连续的切换,所以可想而知一个最大的弊端就是会导致最后的apk会非常的大。
使用Gif。gif的话可以实现很多复杂的动画,但是我们知道Android本身是不支持gif的,而且还需要为各种屏幕的尺寸和分辨率做适配的,还有一个很重要的问题就是gif也会导致apk非常大的。
使用代码实现,比如说补间动画和属性动画来实现很多复杂的动画,但是对于有些不擅长于写动画的童鞋来说是一个头痛的问题。
为了解决上述等等各种问题,懒惰的人们就开发一款可以跨平台的动画框架,动画的路径数据就用一种通用的格式来记录,然后中间的话就分别用对应的平台来实现动画的走动。所以这个时候Lottie就出现了。
设计师的工作(其实这边我们可以不关心)
首先我们让设计使用Adobe的Afeter Effects(简称AE)工具制作这个动画。
然后需要在AE中安装一个叫做的插件,解压缩之后只需要\build\extension\bodymovin.zxp这个档案就可以
手动安装plugin,以window系统而言,要先下载 并解压缩,再把下载的bodymovin压缩后的bodymovin-master/build/extension 目录下的bodymovin.zxp这个档案复制进去同一个资料夹。
去找cmd,并以系统管理员身份执行。
打开 ExManCmd_win所在的路径,进入ExManCmd_win的资料夹中
接着打 ExManCmd.exe /install bodymovin.zxp 就完成了
再来进入AE 后,可以在windows/extentions/bodymovin 找到插件,开启后按下Render 就完成了。 重点来了,这时会在你选的Destination Folder目录中生成一个json格式的文件,这个 json 文件描述了该动画的一些关键点的坐标以及运动轨迹,然后再转发给开发人员。
工程师的工作
首先我们需要在build.gradle 文件引入动画框架
dependencies {
compile 'com.airbnb.android:lottie:2.0.0-beta4'
根据平时的经验我们都知道UI给我们的动画文件或者是资源文件都会放到drawable目录下去的,但是这次 UI 给我们的动画文件我们只能放到Assets目录下的,并不能放到其他的目录下,因为只有这样子的框架才能更好的找到其路径的。下面我们分别的来介绍三种方式加载动画文件。
1. Assets目录默认加载
首先我们将动画文件放到默Assets目录下,然后在layout布局文件中直接引用就可以了,其中fileName就是对应Assets目录下的文件的名字;loop true表示循环播放,false表示只播放一次; auto_play表示一开始就自动播放,设置false的话,就需要自己手动的调用 playAnimation() 来手动进行播放控制
&com.airbnb.lottie.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" /&
2. 从网络上直接获取json数据进行加载
public void loadRemoteLottie() {
request = new Request.Builder().url(url).build();
} catch (IllegalArgumentException e) {
if (client == null) {
client = new OkHttpClient();
client.newCall(request).enqueue(new Callback() {
public void onFailure(Call call, IOException e) {
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
JSONObject json = new JSONObject(response.body().string());
LottieComposition.Factory.fromJson(mResource, json,
new OnCompositionLoadedListener() {
public void onCompositionLoaded(LottieComposition lottieComposition) {
animation_view_network.setProgress(0);
animation_view_network.loop(true);
animation_view_network.setComposition(composition);
animation_view_network.playAnimation();
} catch (JSONException e) {
我们可以通过获取远程json数据的这种格式来动态的配置应用里面的动画,这里面有几个要注意的问题:
这里我们在不能再像以前样子在layout中配置那些属性,这个时候我们只需要在xml中写一个简单的布局文件就可,如果你再设置那些属性的话,比如说你设置了自动播放和循环播放,但是你都还没有加载到资源,所以这个时候会有问题的。
这种通过获取json字符串来实现动画的方式,里面不能包含有图片,比如UE在做动画的时候有时候可能会带有图片的(特殊要求,比如说有些json不能实现的复杂的图片),这个时候如果还是通过这种方式再去加载的话,它会找不到路径的。
3. 从本地加载带有图片的文件
&&&&有的时候UI做的AE动画文件中可能会带有图片的,这个时候如果你再使用原来那种通过获取json字符串的方式去获取本地文件的字符串的时候,这个时候会报一个内部的
You must set an images folder before loading an image. Set it with LottieComposition#setImagesFolder or LottieDrawable#setImagesFolder 因为它有图片,需要我们根据设定的路径去寻找图片并且渲染出来,这个后期我们会慢慢的分析。
private void loadLocal() {
String sdcardPath = Environment.getExternalStorageDirectory();
String path = sdcardPath + "/test_animation/newtest/data.json";
final String imageFolder = sdcardPath + "/test_animation/newtest/images/";
animation_view_network.setImageAssetsFolder(imageFolder);
File file = new File(path);
if(file.exists()) {
FileInputStream fis = new FileInputStream(file);
LottieComposition.Factory.fromInputStream(this, fis,
new OnCompositionLoadedListener() {
public void onCompositionLoaded(LottieComposition lottieComposition) {
setComposition(lottieComposition);
animation_view_network.setImageAssetDelegate(new ImageAssetDelegate() {
public Bitmap fetchBitmap(LottieImageAsset lottieImageAsset) {
String path = imageFolder + lottieImageAsset.getFileName();
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inScaled = true;
opts.inDensity = 160;
Bitmap bitmap = BitmapFactory.decodeFile(path, opts);
} catch (FileNotFoundException e) {
e.printStackTrace();
&&&&&本次我们只是对Lottie Android做一个最基本如何使用它,但是我们学习一个框架的目的不仅仅只是为了学会使用它,更关键的是如何去学习它的思想以及一些好的代码规划。比如说对于本框架来说,我们的目的就是先弄清楚它里面的实现逻辑以及一些好的代码规范的,这样子我们以后也可以写出一个属于自己的框架。下面将会结合官方的例子以及代码将代码和demo放在一起,然后放在csdn上,感兴趣的同学可以在上面下载。
Demo 体验apk下载地址:
Demo 程序的 CSDN 地址:
感激以下文章
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20985次
排名:千里之外
原创:18篇
(1)(4)(2)(1)(2)(2)(1)(5)从json文件到炫酷动画-Lottie实现思路和源码分析 - 简书
从json文件到炫酷动画-Lottie实现思路和源码分析
Lottie是最近Airbnb开源的动画项目,支持Android、iOS、ReactNaitve三个平台,相关背景介绍可以参考之前的文章。本文分析主要Lottie把json文件转为动画的思路和源码实现。
文章首先介绍Lottie的基本使用,然后分析把json文件映射到动画的实现思路,最后分析Lottie的源码实现,这里分析的是Lottie-Android。
与使用相关的只有三个类文件:LottieAnimationView、LottieComposition、LottieDrawable,所以Lottie使用起来特别简单(需要注意Lottie支持API16及以上)。最简单的使用方式是在xml中增加LottieAnimationView:
"Logo/LogoSmall.json"是需要加载的动画数据路径,根目录是assets目录。
也可以通过代码设置动画数据json路径:
然后在代码中控制动画播放或者添加监听事件:
Lottie提供了LottieDrawable可以使用:
可以看到Lottie使用起来非常简单,我们之后就从以上用到的LottieAnimationView、LottieComposition、LottieDrawable入手来分析下Lottie动画的实现原理。
我们先从底层思考下如何在屏幕上绘制动画,最简单的方式是把动画分为多张图片,然后通过周期替换屏幕上绘制的图片来形成动画,这种暴力的方式非常简单,但缺点明显,很耗内存,动画播放中前后两张替换的图片在很多元素并没有变化,重复的内容浪费了空间。
为了提高空间利用率,可以把图片中的元素进行拆分,使用过photoshop的同学知道,其实在处理一张图片时,可以把一张复杂的图片使用多个图层来表示,每个图层上展示一部分内容,图层中的内容也可以拆分为多个元素。拆分元素之后,根据动画需求,可以单独对图层,甚至图层中的元素设置平移、旋转、收缩等动画。
Lottie使用json文件来作为动画数据源,json文件是通过插件导出的,查看sample中给出的json文件,其实就是把图片中的元素进行来拆分,并且描述每个元素的动画执行路径和执行时间。Lottie的功能就是读取这些数据,然后绘制到屏幕上。
现在思考如果我们拿到一份json格式动画如何展示到屏幕上。首先要解析json,建立数据到对象的映射,然后根据数据对象创建合适的Drawable绘制到View上,动画的实现可以通过操作读取到的元素完成。
1. json文件到对象的映射
Lottie使用LottieComposition来作为After Effects的数据对象,即把json文件映射到LottieComposition,LottieComposition中提供了解析json的静态方法:
我们看下LottieComposition都有哪些成员变量,这些成员变量描述了After Effects中的动画。
可以看到startFrame、endFrame、duration、scale等都是动画中常见的。我们看下List&Layer&,看名字就是映射拆分后的图层数据:
Layer 中完成layer的json数据解析:
2. 数据对象到Drawable的映射
AnimatableLayer 继承自 Drawable,我们看下它的子类:
其中LayerView对应着Layer数据,Layer中有
对应的LayerView中有
可以简单地理解为ViewGroup中可以包含ViewGroup或者View,但其实整个Lottie实现的动画都是绘制在一个View LottieAnimationView上。
AnimatableLayer 的其它子类如 ShapeLayer,RectLayouer等作为 LayerView 中List&AnimatableLayer&的元素。
LottieAnimationView 继承自 AppCompatImageView,封装了一些动画的操作,如:
具体的绘制时委托为 LottieDrawable 完成的,我们看下 LottieDrawable 中的 draw() 方法:
LottieDrawable 继承自AnimatableLayer,其draw()方法如下:
可以看到先绘制了本层的内容,然后开始绘制包含的layers的内容:
这个过程于界面中ViewGroup嵌套绘制类似。
上面我们根据动画绘制的思路分析了下Lottie实现机制,下面从正面来捋一下程序的执行过程:
创建LottieAnimationView
lottieAnimationView
创建LottieDrawable lottieDrawable
使用LottieComposition中的静态方法解析json文件创建LottieComposition lottieComposition,这个过程中已经创建来多个Layer对象。
lottieDrawable.setComposition(lottieComposition)
先清理之前的数据,然后开始buildLayersForComposition,即根据lottieComposition建立多个layerView,此时已经创建好了多个Drawable,并通过List建立的为以lottieDrawable为根的一个drawable树。
lottieAnimationView.setImageDrawable(lottieDrawable)
lottieAnimationView.playAnimation()
直接委托给了lottieDrawable,lottieDrawable中有private final ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
重点看下setProgress方法
调用了private final List&KeyframeAnimation&?&& animations = new ArrayList&&() 的setProgress:
在onValueChanged时,各个创建好的Drawable会根据需求进行重绘,达到动画的效果。
Lottie把动画从View的动效转移到了Drawable上。
Lottie的性能
可以看到Lottie把json描述的动画数据映射到Drawable之后,实现动画时用到了ValueAnimator,在动画更新时使用Drawable而非View,个人感觉在不需要交互时Drawable显然比View更加轻量。以下是Lottie性能的官方的说明:
如果没有mask和mattes,那么性能和内存非常好,没有bitmap创建,大部分操作都是简单的cavas绘制。
如果存在mattes,将会创建2~3个bitmap。bitmap在动画加载到window时被创建,被window删除时回收。所以不宜在RecyclerView中使用包涵mattes或者mask的动画,否则会引起bitmap抖动。除了内存抖动,mattes和mask中必要的bitmap.eraseColor()和canvas.drawBitmap()也会降低动画性能。对于简单的动画,在实际使用时性能不太明显。
如果在列表中使用动画,推荐使用缓存LottieAnimationView.setAnimation(String, CacheStrategy) 。
欢迎关注公众号wutongke,每天推送移动开发前沿技术文章:
推荐阅读:

我要回帖

更多关于 js动画框架 的文章

 

随机推荐