Android之Lottie动画详解
文章大纲
一、Lottie介绍
二、Lottie实战
三、项目源码下载
四、参考文章

一、Lottie介绍
1. 什么是Lottie
Lottie是Android和iOS的移动库,用于解析Adobe After Effects动画与Bodymovin一起导出为json 并在移动设备上呈现它们!其实在移动端就是通过一个json文件显示相应的动画,其实这样很好的解决了动态改变动画的能力,只需要动态加载相应的josn文件就能实现动画的改变。(josn由美工提供)
2. Lottie优点
(1)能够解析渲染通过 AE 上的 Bodymovin 插件将 AE 中制作好的动画导出成的 json 文件
(2)数据源多样性—可从assets,sdcard,网络加载动画资源,动态更新
(3)跨平台—设计稿导出一份动画描述文件,android,ios,react native通用(android使用的api不能低于16)
3. Lottie动画制作流程图

4. Lottie例子

二、Lottie实战
1. 常见的API介绍
(1)判断是否动画正在运行中
isAnimating()
(2)设置动画的进度值(float值)
setProgress();
(3)监听动画进度
addAnimatorUpdateListener
(4)开始动画
playAnimation()
(5)动态设置json文件
setComposition
2. 代码实操
(1)在项目的 build.gradle 文件添加依赖
dependencies {
implementation 'com.android.support:appcompat-v7:24+'
//lottie依赖
implementation 'com.airbnb.android:lottie:1.0.1'
//网络请求相关依赖
implementation 'com.squareup.okhttp3:okhttp:3.5.0'
}
(2)相关json文件

(3)xml加载Lottie动画
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<!--如此,动画就能跑起来了,解释下一下属性:
1.lottie_fileName:在app/src/main/assets目录下的动画json文件名。
2.lottie_loop:动画是否循环播放,默认不循环播放。
3.lottie_autoPlay:动画是否自动播放,默认不自动播放。
4.alottie_imageAssetsFolder:动画所依赖的图片目录,在pp/src/main/assets/目录下的子目录,该子目录存放所有图片。-->
<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"/>
</LinearLayout>
其他常见api:
(1)lottie_repeatCount 重复次数
(2)lottie_repeatMode 设置动画的重复模式RESTART:重复、REVERSE:反向
(3)lottie_colorFilter 设置动画的着色颜色,这个就是把你的动画变成了一个颜色的了
Activity代码如下所示
/**
* 简单动画
*/
public class SimpleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// activity_simple.xml中 lottie_fileName="data.json"
// 所以只需要在 app/src/main/assets 中添加AE 生成的 json文件,重命名为data.json就可以显示动画
setContentView(R.layout.activity_simple);
}
}
(4)Activity中加载Lottie
xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="horizontal"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation_view_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_seek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@android:color/white"
android:textSize="16sp" />
<Button
android:id="@+id/button1"
android:layout_width="100dip"
android:layout_height="40dip"
android:background="@color/colorPrimary"
android:text="开始动画" />
<Button
android:id="@+id/button2"
android:layout_width="100dip"
android:layout_height="40dip"
android:layout_marginLeft="10dip"
android:background="@color/colorPrimary"
android:text="结束动画" />
</LinearLayout>
</LinearLayout>
Activity代码如下
package com.zkk.lottietest;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.model.LottieComposition;
public class ClickActivity extends AppCompatActivity {
private Button button1,button2;
private TextView tv_seek;
LottieAnimationView animation_view_click;
@SuppressLint("RestrictedApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_click);
animation_view_click=(LottieAnimationView)findViewById(R.id.animation_view_click);
tv_seek=(TextView)findViewById(R.id.tv_seek);
button1=(Button)findViewById(R.id.button1);
button2=(Button)findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startAnima();
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopAnima();
}
});
//代码设置Lottie
LottieComposition.fromAssetFileName(this, "LottieLogo1.json", new LottieComposition.OnCompositionLoadedListener() {
@Override
public void onCompositionLoaded(LottieComposition composition) {
animation_view_click.setComposition(composition);
animation_view_click.setProgress(0.333f);//progress范围0~1f,设置动画进度
animation_view_click.playAnimation();//播放动画
}
});
//动画状态监听回调
animation_view_click.addAnimatorUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
tv_seek.setText(" 动画进度" +(int) (animation.getAnimatedFraction()*100) +"%");
}
});
}
/*
* 开始动画
*/
private void startAnima(){
//判断动画是否在运行
boolean inPlaying = animation_view_click.isAnimating();
if (!inPlaying) {
animation_view_click.setProgress(0f);//设置开始时的进度值
animation_view_click.playAnimation();
}
}
/*
* 停止动画
*/
private void stopAnima(){
//判断动画是否在运行
boolean inPlaying = animation_view_click.isAnimating();
if (inPlaying) {
animation_view_click.cancelAnimation();
}
}
@Override
protected void onStop() {
super.onStop();
animation_view_click.cancelAnimation();
}
}
(5)网络加载动画
xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animation_view_network"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Activity代码如下
package com.zkk.lottietest;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.model.LottieComposition;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* 网络请求动画
*/
public class NetworkActivity extends AppCompatActivity {
LottieAnimationView animation_view_network;//Lottie组件
private OkHttpClient client;//Okhttp客户端
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_network);
//获取Lottie组件
animation_view_network=(LottieAnimationView)findViewById(R.id.animation_view_network);
//在线加载Lottie的json
loadUrl("http://cdn.trojx.me/blog_raw/lottie_data_edit.json");
}
private void loadUrl(String url) {
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() {
@Override public void onFailure(Call call, IOException e) {
}
@SuppressLint("RestrictedApi")
@Override public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
}
try {
//获取返回的json内容
JSONObject json = new JSONObject(response.body().string());
//设置动画
LottieComposition
.fromJson(getResources(), json, new LottieComposition.OnCompositionLoadedListener() {
@Override
public void onCompositionLoaded(LottieComposition composition) {
setComposition(composition);
}
});
} catch (JSONException e) {
}
}
});
}
private void setComposition(LottieComposition composition){
animation_view_network.setProgress(0);//设置当前进度
animation_view_network.loop(true);//动画是否循环播放
animation_view_network.setComposition(composition);
animation_view_network.playAnimation();//开始动画
}
@Override
protected void onStop() {
super.onStop();
animation_view_network.cancelAnimation();//取消动画
}
}
三、项目源码下载
链接:https://pan.baidu.com/s/1fflg3Gmws-hh_3nj1N7fwg
密码:1etb
四、参考文章
- https://blog.csdn.net/qq_15538877/article/details/80503773
- https://www.jianshu.com/p/282d098cf928?utm_source=oschina-app
Android之Lottie动画详解的更多相关文章
- Android中的动画详解系列【4】——Activity之间切换动画
前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自定义动画,这一篇我们来看看如何将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 如 ...
- Android 三种动画详解
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...
- android之tween动画详解
android中一共提供了两种动画,其一便是tween动画,tween动画通过对view的内容进行一系列的图像变换(包括平移,缩放,旋转,改变透明度)来实现动画效果,动画效果的定义可以使用xml,也可 ...
- android之frame动画详解
上一篇我们说了android中的tween动画,这一篇我们说说frame动画,frame动画主要是实现了一种类似于gif动画的效果,就是多张图按预先设定好的时间依次连续显示. 新建一个android项 ...
- Android 开发之动画详解
一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画 ...
- Android中的动画详解系列【3】——自定义动画研究
在上一篇中我们使用到了位移动画TranslateAnimation,下面我们先来看看TranslateAnimation是如何实现Animation中的抽象方法的: /* * Copyright (C ...
- Android中的动画详解系列【2】——飞舞的蝴蝶
这一篇来使用逐帧动画和补间动画来实现一个小例子,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包括下面几个子类: AlphaAnimation ...
- Android中的动画详解系列【1】——逐帧动画
逐帧动画其实很简单,下面我们来看一个例子: <?xml version="1.0" encoding="utf-8"?> <animation ...
- [转]ANDROID L——Material Design详解(动画篇)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/de ...
随机推荐
- spring+springmvc+mybatis构建系统
今天和大家分享的是spring+springmvc+mybatis搭建框架的例子,说到这里不得不说现在市面上一流大公司还有很多用这种架子,创业型公司大部分都用springboot集成的mvc+myba ...
- PAT1096:Consecutive Factors
1096. Consecutive Factors (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...
- Oracle聚合函数
max(),min(),avg(),sum() 其中 avg(),sum()只能操作数字 , max(),min()能操作数字.日期.字母 等.
- 对于Javascript 执行上下文的理解
转载无源头地址 在这篇文章中,将比较深入地阐述下执行上下文 – JavaScript中最基础也是最重要的一个概念.相信读完这篇文章后,你就会明白javascript引擎内部在执行代码以前到底做了些什么 ...
- Go笔记之二:一个完整的播放器示例
Go笔记之二:一个完整的播放器示例 该示例从命令行运行一个播放器示例,可进行添加.删除.浏览和模拟播放,其内容是对 Go 语言接口使用的良好展示 源码及可执行文件 参考书籍<Go语言编程> ...
- linux ubuntukylin和deepin操作系统的比较及改进方向的建议
研发中国的操作系统的需求在我看来是安全,还有就是自主.如果做的好还可以在创新上,使用体验上进行一波超越.现有的所谓的国产操作系统我了解的除了基于安卓的凤凰系统就是基于Linux的像优麒麟和deepin ...
- 微信小程序基于第三方websocket的服务器端部署
微信小程序后台请求越来越严格 1.request要求用https 2.websocket要求用wss 3.测试后发现websocket只能走433端口 作为.net开发,websocket又是使用的第 ...
- yum 出问题了
今天用yum 安装ntp 的过程中用了 Ctrl+ z, 然后yum 再也不能使用了: error: rpmdb: BDB0113 Thread/process 6589/14060193936774 ...
- 关于Kafka日志留存策略的讨论
关于Kafka日志留存(log retention)策略的介绍,网上已有很多文章.不过目前其策略已然发生了一些变化,故本文针对较新版本的Kafka做一次统一的讨论.如果没有显式说明,本文一律以Kafk ...
- 简化异常处理的Throwables类
简化异常处理的Throwables类 有时候, 当我们我们捕获异常, 并且像把这个异常传递到下一个try/catch块中.Guava提供了一个异常处理工具类, 可以简单地捕获和重新抛出多个异常.例如: ...