Lottie是什么?

今天接手一个新项目的时候发现以前的同事引入了Lottie库,因为之前没有接触过后来百度了一下发现原来这个库主要是用来实现一些比较复杂的动画的。下面是官方的介绍,Lottie是Airbnb开源的一个支持Android、ios以及ReactNative,利用json文件的方式快速的实现动画效果的库,接下来就介绍一下它的如何使用的。

最开始我们就去github上看看它的源代码以及Demo:

https://github.com/airbnb/lottie-android

以前我们在实现动画的时候一般都有以下几种方式:

  • 使用帧动画。这种方式就是多张图片连续的切换,所以可想而知一个最大的弊端就是会导致最后的apk会非常的大。
  • 使用Gif。gif的话可以实现很多复杂的动画,但是我们知道Android本身是不支持gif的,而且还需要为各种屏幕的尺寸和分辨率做适配的,还有一个很重要的问题就是gif也会导致apk非常大的。
  • 使用代码实现,比如说补间动画和属性动画来实现很多复杂的动画,但是对于有些不擅长于写动画的童鞋来说是一个头痛的问题。
    为了解决上述等等各种问题,懒惰的人们就开发一款可以跨平台的动画框架,动画的路径数据就用一种通用的格式来记录,然后中间的话就分别用对应的平台来实现动画的走动。所以这个时候Lottie就出现了。

设计师的工作(其实这边我们可以不关心)

  • 首先我们让设计使用Adobe的Afeter Effects(简称AE)工具制作这个动画。
  • 然后需要在AE中安装一个叫做Bodymovin的插件,解压缩之后只需要\build\extension\bodymovin.zxp这个档案就可以

  • 手动安装plugin,以window系统而言,要先下载ExMan Command Line tool 并解压缩,再把下载的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.LottieAnimationViewandroid: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 request;try {request = new Request.Builder().url(url).build();} catch (IllegalArgumentException e) {return;}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()) {try {JSONObject json = new JSONObject(response.body().string());LottieComposition.Factory.fromJson(mResource, json, new OnCompositionLoadedListener() {@Overridepublic 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数据的这种格式来动态的配置应用里面的动画,这里面有几个要注意的问题:

    1. 这里我们在不能再像以前样子在layout中配置那些属性,这个时候我们只需要在xml中写一个简单的布局文件就可,如果你再设置那些属性的话,比如说你设置了自动播放和循环播放,但是你都还没有加载到资源,所以这个时候会有问题的。
    2. 这种通过获取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/";//1. 开始的时候我们需要设置它的图片存储的地方animation_view_network.setImageAssetsFolder(imageFolder);File file = new File(path);if(file.exists()) {try {FileInputStream fis = new FileInputStream(file);LottieComposition.Factory.fromInputStream(this, fis, new OnCompositionLoadedListener() {@Overridepublic void onCompositionLoaded(LottieComposition lottieComposition) {setComposition(lottieComposition);}});//2. 然后调用该方法分别的去获取对应图片的地址,然后转化为Bitmapanimation_view_network.setImageAssetDelegate(new ImageAssetDelegate() {@Overridepublic 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);return bitmap;}});} catch (FileNotFoundException e) {e.printStackTrace();}}}

本次我们只是对Lottie Android做一个最基本如何使用它,但是我们学习一个框架的目的不仅仅只是为了学会使用它,更关键的是如何去学习它的思想以及一些好的代码规划。比如说对于本框架来说,我们的目的就是先弄清楚它里面的实现逻辑以及一些好的代码规范的,这样子我们以后也可以写出一个属于自己的框架。下面将会结合官方的例子以及代码将代码和demo放在一起,然后放在csdn上,感兴趣的同学可以在上面下载。

  • Demo 体验apk下载地址:https://fir.im/2rf6
  • Demo 程序的 CSDN 地址:http://download.csdn.net/detail/u012417984/9827778

感激以下文章

Lottie- 让Android动画实现更简单

Lottie动画学习一 —— 入门博客介绍相关推荐

  1. Django 学习小组:博客开发实战第二周教程 —— 实现博客详情页面和分类页面

    本教程内容已过时,更新版教程请访问: django 博客开发入门教程. 上周我们完成了博客的 Model 部分,以及 Blog 的首页视图 IndexView. 本节接上周的文档 Django 学习小 ...

  2. 学习Linux的博客和资源网站

    个人推荐一些优质学习Linux的博客和网站 1.Katacoda - Interactive Learning Platform for Software Engineers 网页版的交互式软件工程师 ...

  3. 对系统学习与写博客的看法——学完《第一行代码》有感

    笔者如今学习android有近8个月,此时才真正地学完一本书也甚是惭愧. 在此分享一下自己大概的学习经历.(笔者在大一下就开始学android了,学的时候只有c与c++的基础,一个学期+寒假在OJ上刷 ...

  4. ubuntu 安装Pangolin 过程_余辉亮的学习笔记的博客-CSDN博客_pangolin安装

    ubuntu 安装Pangolin 过程_余辉亮的学习笔记的博客-CSDN博客_pangolin安装

  5. Python中的TCP的客户端UDP学习----第一篇博客

    Python中的TCP的客户端&UDP学习--第一篇博客 PS: 每日的怼人句子"我真想把我的脑子放到你的身体里,让你感受一下智慧的光芒" 先说UDP流程 发送: 创建套接 ...

  6. 发布 学习进度条 博客要求

    学习进度条博客 (总分:10分) 1. 目的 通过每周补充完善进度条,记录你自己学习<软件工程>的历程.收获: 通过学习进度条来跟踪自己的学习状况. 2. 学习进度条撰写要求 标题:学习进 ...

  7. Python 有哪些好的学习资料或者博客?

    全了!Python各大阶段知识汇总 第一阶段:python基础入门 ​ 黑马程序员最新Python教程,8天python从入门到精通,学python看这套就够了_哔哩哔哩_bilibili黑马程序员最 ...

  8. python资料-Python 有哪些好的学习资料或者博客?

    一.说明 面对网络上纷繁复杂的资料,自己真是眼花缭乱,学的毫无章法,东一榔头西一棒子,这样不仅知识不能成为体系,自己的学习进度也不容易掌握,收效甚微.突然有个想法,就是把自己这几天收藏的资料整理出文章 ...

  9. python有哪些好的学习资料或者博客

    推荐Full Stack Python 有各种python资源汇总,从基础入门到各种框架web应用开发和部署,再到高级的ORM.Docker都有.以下是Full Stack Python 上总结的一些 ...

最新文章

  1. 这篇论文,透露谷歌团队构想的“未来搜索”
  2. MyBatis 如何兼容所有日志框架?
  3. java反射 int_java反射如何调用参数为int的方法?
  4. 马斯克Neuralink被曝“虐杀实验猴”,140万元美金项目遭谴责
  5. softAP配网:用Android手机为linux无屏设备输入wifi密码
  6. 【深度学习入门到精通系列】R2 Unet解释
  7. Hadoop与Hbase基本配置
  8. Redis Hash 哈希 结构
  9. python中str用法_python数据类型之str用法
  10. PE文件的感染C++源代码
  11. matlab中 %s 是什么意思,ie在matlab中是什么意思
  12. python切片表达式3个参数_Python:Base3(函数,切片,迭代,列表生成式)
  13. 凭一张照片找到视频中你所有的镜头,包括背影丨商汤ECCV 2018论文
  14. 聚观早报 | 华为官宣新机Pocket S;苹果旗舰店开售智能门锁
  15. wwwscan目录扫描器的逆向分析
  16. 分享一个MAC下绕开百度网盘限速下载的方法,三步操作永久生效
  17. Could not resolve dependencies for project com.koolearn:koo-b2b-tesa-api:jar:1.0-dev-SNAPSHOT
  18. java word转图片(word转pdf再转图片)
  19. Mina2框架--服务端与客户端通信
  20. opencv 学习笔记(七) 灰度变换

热门文章

  1. Android全面解析之Activity生命周期
  2. jquery个性滚动条插件jquery.mCustomScrollbar.js的使用
  3. 考清美哪个画室好?考清美选什么画室
  4. 一键!构建最大似然树~ 简单又准确
  5. SnapGene Viewer for mac(生物分子克隆软件)
  6. 在移动设备上使用豆瓣FM Pro
  7. 象棋小游戏(pygame)总体分析及资源准备
  8. 什么是互操作协议LayerZero?
  9. 用Turtle实现狗追兔子的建模仿真
  10. 武汉大学计算机学院出国,2017年6月武汉大学研究生出国交流资助项目评审结果公示...