文档章节

Android之Lottie动画详解(非原创)

o
 osc_gu9d45li
发布于 2019/04/07 17:24
字数 1352
阅读 63
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

文章大纲

一、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

四、参考文章

  1. https://blog.csdn.net/qq_15538877/article/details/80503773
  2. https://www.jianshu.com/p/282d098cf928?utm_source=oschina-app
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Lottie 动画so easy 支持android/ios/react-native/web

1、Lottie简介 Lottie是Airbnb开源的一个支持 Android、iOS 以及 ReactNative,利用json文件的方式快速实现动画效果的库 android库的地址:https://github.com/airbnb/lottie-android IOS库的...

_无问西东
2018/09/17
208
0
Lottie——强大的动画渲染框架

概述 Airbnb开源的强大的动画框架,适用于Android,IOS,React Native和Web。可以使用AE导出的JSON格式的动画,并解析为原生动画效果。 特点: 跨平台 —— 一份动画效果,多平台通用。多种方...

钟小明_
04/08
21
0
这样做动画交互,一点都不费力!

本文由云+社区发表 作者:paulzeng 导语:Lottie是Airbnb开源的一个面向 iOS、Android、React Native 的动画库,可实现非常复杂的动画,使用也及其简单,极大释放人力,值得一试。 一、简介 ...

osc_y8w65yuq
2019/01/09
2
0
Lottie开源动画库

一款Lottie的动画库,效果挺好,查了一下发现这款动画库可以支持H5。它能够同时支持iOS、Android、ReactNative和H5的开发。Lottie动画库和Bodymovin的AE插件结合,把在AE上做好的动画导出为j...

阿刚ABC
2018/05/14
4.7K
0
Lottie动画简介

感谢支持ayqy个人订阅号,每周义务推送1篇(only unique one)原创精品博文,话题包括但不限于前端、Node、Android、数学(WebGL)、语文(课外书读后感)、英语(文档翻译) 如果觉得弱水三...

前端向后
2018/09/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SO_REUSEADDR和SO_REUSEPORT有何不同? - How do SO_REUSEADDR and SO_REUSEPORT differ?

问题: The man pages and programmer documentations for the socket options SO_REUSEADDR and SO_REUSEPORT are different for different operating systems and often highly confusing.......

法国红酒甜
27分钟前
28
0
asp.net core之SignalR

SignalR 是什么? ASP.NET Core SignalR 是一个开源的实时框架,它简化了向应用中添加实时 Web 功能的过程。 实时 Web 功能是服务器端能够即时的将数据推送到客户端,而无需让服务器等待客户端...

一介草民Coder
58分钟前
24
0
如何通过日期属性对数组进行排序 - How to sort an array by a date property

问题: Say I have an array of a few objects: 说我有一些对象的数组: var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}]; How can I sort......

javail
今天
22
0
技术教程| 百度鹰眼历史轨迹查询:轨迹抽稀功能

本文作者:用****9 本篇教程中,我们将详细地说明鹰眼历史轨迹查询(gettrack接口)中,如何通过vacuate_grade选项对轨迹进行抽稀,以及不同的抽稀力度对轨迹产生的影响。 上一篇教程中,我们...

百度开发者中心
前天
24
0
Quartz的Misfire处理规则 错过任务执行时间的处理机制

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 CronTrigger withMisfireHandlingInstructionDoNothing ——不触发立即执行 ——等待下次Cron触发频率...

独钓渔
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部