Lottie动画 轻松使用

2023-05-16

Android 敏捷开发助手

  1. Lottie动画 轻松使用
  2. PNG、JPG等普通图片高保真转SVG图
  3. Android 完美的蒙层方案
  4. Android MMKV框架引入使用
  5. 强大无匹的自定义下拉列表
  6. Google Protobuf 实践使用开发

Android Lottie动画

  • 前言
  • 优缺点
  • 配置使用
  • 方法使用
  • Lottie 动画原理
  • 总结

博客创建时间:2021.04.24
博客更新时间:2023.01.28

以Android studio build=7.0.0,SDKVersion 31来分析讲解。如图文和网上其他资料不一致,可能是别的资料版本较低而已。


前言

Android开发中,常规的动画特效有:

  1. 补间动画
  2. 帧动画
  3. 属性动画
  4. SVG动画

UI常常会用到一些动画特效,比如心形跳动、返回效果等,此时常规手段往往力不从心,使用Lottie就能助力你飞起来。

Lottie是一个为Android和iOS设备提供的一个开源框架,它能够解析通过Adobe After Effects 软件做出来的动画,动画文件通过Bodymovin导出json文件,然后由Lottie中的LottieAnimationView解析json渲染动画。 (如上图)

Lottie支持多平台,使用同一个JSON动画文件,可在不同平台实现相同的效果。Android 通过Airbnb的开源项目lottie-android实现,最低支持 API 16。

Lottie Github地址:https://github.com/airbnb/lottie-android
Lottie材料网站:https://lottiefiles.com/


优缺点

优点:

  1. 由于将动画变成了json字符串,相比几M体积的gif图,等质量下的压缩率达到80%及以上。

  2. 支持云端动画资源加载,上线新的动画效果不需要发版

  3. 支持实时渲染 After Effects 动画,让 app 加载动画像加载图片一样简单。

  4. 因为Lottie是利用json文件生成动画,从而避免了不同分辨率、不同设备尺寸上面动画效果存在差异的问题。

  5. 只需要进行一动画绘制,生成一次json文件,跨端使用(android、ios、web)
    Android: API16+
    IOS : IOS8+ /MacOS 10.10+
    WEB:调用Bodymovin提供的js库 — bodymovin.js

  6. 拿到动画.json文件后,研发可以灵活的自行修复动画的颜色、路径等数据,自行扩展

  7. 拥有完整丰富的API,除了常规的播放、控制进度、暂停控制,还可以缓存、添加额外的原生UI

  8. 在未开启硬件加速的情况下,帧率、内存,CPU都比属性动画差,开启硬件加速后,性能差不多。

缺点:

  1. Lottie尚不支持效果菜单中的表达式或任何效果。

  2. 使用alpha遮罩会影响性能。 如果你使用的是alpha遮罩或alpha倒置遮罩,遮罩的大小会对性能产生更大的影响。

  3. Lottie还不支持阴影,颜色叠加或笔触等图层效果。

  4. 导出比您想要支持的最宽屏幕更宽的动画,使开发者在Android上使用centerCrop类型或在iOS上使用aspectFill内容模式。


配置使用

依赖配置如下

    implementation 'com.airbnb.android:lottie:2.7.0'
    implementation 'com.airbnb.android:lottie:$lottieVersion'
    @SuppressLint("ResourceType")
    private void initView() {
        LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.lottieAnimationView);
        // 设定 asssets文件目录
        // lottieAnimationView.setImageAssetsFolder("images");
        // 在assets目录下的动画json文件名。
//        animationView.setAnimation("face.json");
        animationView.setImageResource(R.raw.face);
//        animationView.setAnimationFromUrl("https://lottiefiles.com/60170-search");

    // 开启硬件加速
    lottieAnimationView.useHardwareAcceleration(true);
        //设置动画循环播放
        animationView.loop(true);
        //assets目录下的子目录,存放动画所需的图片
//        animationView.setImageAssetsFolder("images/");
        animationView.playAnimation();//播放动画
    }

部分参数可以直接在xml 控件中使用

    <!-- xml配置使用  -->
    <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/lottieAnimationView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:lottie_fileName="hello-world.json"
        app:lottie_loop="true"
        app:lottie_rawRes="@raw/heart"
        app:lottie_imageAssetsFolder="images"
        app:lottie_autoPlay="true"/>

lottie_fileName :在app/src/main/assets目录下的动画,以json文件名。
lottie_rawRes:存放在app/src/main/res/raw 目录下的json动画
app:lottie_rawRes,app:lottie_fileName这两个属性基本相似。
lottie_loop:动画是否循环播放,默认不循环播放。
lottie_autoPlay:动画是否自动播放,默认不自动播放。
lottie_imageAssetsFolder:动画所依赖的图片目录,在app/src/main/assets/目录下的子目录,该子目录存放所有图片。
lottie_colorFilter :设置动画的着色颜色
lottie_repeatCount :重复次数,当你设置-1的时候就代表相应的循环了!
lottie_scale :设置动画的比例
lottie_repeatMode: 设置动画的重复模式RESTART:重复、REVERSE:反向


方法使用

1. 资源加载
动画文件加载有三种方式
1.加载main/assets目录下的动画
在这里插入图片描述

	    // 1.代码调用
        animationView.setImageAssetsFolder("test.json");
		// 或者 xml调用
		app:lottie_fileName="test.json"

2.加载res/raw目录下的动画
在这里插入图片描述

   app:lottie_rawRes="@raw/face"

3.加载Url
注意url指向的内容需要时json格式的数据
java animationView.setAnimationFromUrl("https://lottiefiles.com/60170-search");


2. 基本操作

	// 动画是否正在运行
	animationView.isAnimating()
	// progress范围0~1f,设置动画进度
	animationView.setProgress(0.5f);
	
	//播放动画
    animationView.playAnimation();
    //取消动画
    animationView.cancelAnimation();
    // 暂停动画
	lottieAnimationView.pauseAnimation();

	//重启动画
	animationView.resumeAnimation();
	//设置X轴方向上的缩放比例,0f为不可见,1f原始大小 Ps.原setScale方法在2.0.0版本后已弃用
	animationView.setScaleX(0.5f);
	//设置Y轴方向上的缩放比例
 	animationView.setScaleY(0.5f);

	
	setMinFrame(...)
	setMaxFrame(...)
	setMinProgress(...)
	setMaxProgress(...)
	setMinAndMaxFrame(...)
	setMinAndMaxProgress(...)

	animationView.setProgress(0.5f);//手动设置动画进度
 
 	// Custom animation speed or duration.
 	ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f)//自定义一个属性动画
     .setDuration(500);

3. 动作监听

        // json文件加载完成监听
        animationView.addLottieOnCompositionLoadedListener {  }
        //监听动画播放进度 [0,1] 
        lottieAnimationView.addAnimatorUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        	@Override
       		public void onAnimationUpdate(ValueAnimator valueAnimator) {
            // 判断动画加载结束
           	 if (valueAnimator.getAnimatedFraction() == 1f) {
                if (dialog.isShowing() && getActivity() != null)
                    dialog.dismiss();
           		 
        	}
    	});
   
   		animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
     		 @Override
      		public void onAnimationUpdate(ValueAnimator animation) {
          		animationView.setProgress(animation.getAnimatedValue());
      		}
    	});
 		animator.start();
        

4. 设置动画文件夹代理

    // 设置动画文件夹代理类
    lottieAnimationView.setImageAssetDelegate(new ImageAssetDelegate() {
        @Override
        public Bitmap fetchBitmap(LottieImageAsset asset) {
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inScaled = true;
            opts.inDensity = UtilPhoneParam.densityDpi;
            Bitmap bitmap = null;
            try {
                bitmap = BitmapFactory.decodeFile(absolutePath + File.separator + asset.getFileName(), opts);
            }catch (Exception e){
                e.printStackTrace();
            }
            return bitmap;
        }
    });

5. 加载SDCard字体


lottieAnimationView.setFontAssetDelegate(new FontAssetDelegate(){
    public Typeface fetchFont(String fontFamily) {
        Typeface customFont = Typeface.createFromFile(FONT_PATH + fontFamily);
        return customFont;
    }
});

6. 缓存设置

/*
* Lottie内部有两个缓存map(强引用缓存,弱引用缓存),在动画文件加载完成后会根据设置的缓存策略缓存动画,方便下次使用。
*/
lottieAnimationView.setAnimation(animation, LottieAnimationView.CacheStrategy.Strong);    //强缓存

lottieAnimationView.setAnimation(animation, LottieAnimationView.CacheStrategy.Weak);      //弱缓存

LottieAnimationView.CacheStrategy.None);      //默认

lottieAnimationView.setProgress(progress);        //设置当前进度
lottieAnimationView.buildDrawingCache();          //强制缓存绘制数据
Bitmap image = lottieAnimationView.getDrawingCache(); //获取当前绘制数据

在列表中使用动画,推荐使用缓存,避免内存抖动。


7. 显示效果定义

// 任何符合颜色过滤界面的类
final PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.LIGHTEN);

// 在整个视图中添加一个颜色过滤器
animationView.addColorFilter(colorFilter);

//在特定的图层中添加一个颜色滤镜
animationView.addColorFilterToLayer("hello_layer", colorFilter);

// 添加一个彩色过滤器特效“hello_layer”上的内容
animationView.addColorFilterToContent("hello_layer", "hello", colorFilter);

// 清除所有的颜色滤镜
// 颜色过滤器只适用于图层,如图像层和实体层,以及包含填充、描边或组内容的内容。
animationView.clearColorFilters();

Lottie 动画原理

在这里插入图片描述
LottieDrawable会分出很多图层,然后用图层管理者 CompositionLayers去分别进行绘制。

绘制的时候根据时间,计算每个时间点的 关键帧。这个时候用到了我们在属性动画所学过的 KeyFrame 关键帧处理类。
在这里插入图片描述

Android端的实现是基于Drawable,IOS端是基于Layer,最终都是对canvas的操作。原理实质是使用各平台的 核心 Animation 的API进行动画的绘制和渲染。

总结

Lottie动画对于UI要求较高的项目是个非常必要的选择,使用普通动画无法实现的效果,使用Lottie能轻松达到。
自己写的案例demo,供大家一看Lottie源码。


相关链接

  1. Lottie动画 轻松使用
  2. PNG、JPG等普通图片高保真转SVG图
  3. Android 完美的蒙层方案
  4. Android MMKV框架引入使用
  5. 强大无匹的自定义下拉列表
  6. Google Protobuf 实践使用开发

扩展链接:

  1. Android CameraX 使用入门
  2. Android 今日头条屏幕适配详细使用攻略
  3. Android 史上最新最全的ADB及命令百科,没有之一

扩展训练:

  1. lottie的基本使用
  2. LottieAnimationView控件进行何样的自定义设定

博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lottie动画 轻松使用 的相关文章

  • vue使用lottie web插件渲染动画

    1 先安装相应的插件 npm install lottie web save 2 引入插件 我这里是局部引入的 import lottieWeb from 39 lottie web 39 3 使用 xff0c 整体代码如下 xff0c 我
  • Android中使用lottie资源

    lottie资源的使用 1 下载lottie文件的网址 xff1a https lottiefiles com xff0c 下载的文件为 json的文件 2 存放在Android的位置为 3 在应用级别的 build gradle 文件中添
  • Lottie源码分析

    简介 我们使用Lottie的时候 xff0c 最关键的类就是LottieAnimationView 继承自ImageView 和LottieDrawable 继承自Drawable xff0c Lottie的描述文件最终会解析成一系列的La
  • Android Lottie动画

    Android Lottie动画 在Android中 xff0c 往往UI会让写一些动画效果 xff0c 比如启动页心形跳动 xff0c 返回效果等 一般我们在项目中常用的动画无非是以下几种 xff1a 普通动画帧动画属性动画通过改变Lay
  • android lottie字体json,Lottie 读取 JSON 文件实现动画

    Lottie Lottie 是 Airbnb 开源的一个动画项目 xff0c 它支持 iOS mac OS Android RN xff0c 由于某些复杂动画的实现 xff0c 往往会写很多的 code 来实现它 xff0c 而且调试动画的
  • iOS 上接入Lottie动画 接入Json动画

    iOS设备上的动画借助官方SDK xff1a CoreAnimation那一套已经比较强大了 xff0c 基本上的动效都能实现 xff0c 就是1 开发这边比较累 xff1b 2 安卓那边也比较累况且 俩平台最后展示的可能有些细节还不一样
  • Lottie源码浅探

    Lottie xff08 源码版本 xff1a 2 5 4 xff09 动画步骤 xff1a 前置知识 xff1a Lottie对动画的变换主要是通过Matrix实现 xff0c 因此需要了解Matrix相关知识 xff0c 可以参考下面的
  • H5/js/web lottie解析json 播放视频或动画

    H5 js web lottie解析json 播放视频或动画 1 需要UI设计的小伙伴用AE把效果图导出时导成JSON格式 xff0c 并且把json引入到你需要用到的项目里面2 在index html中引入lottie min js3 查
  • Android lottie java.lang.IllegalStateException: Missing values for keyframe. 问题解决

    对接lottie时 xff0c 根据Lottie用法 xff0c 加载json xff0c 效果显示不出来 xff0c lottie官网上预览json显示正常 xff0c 大量搜索后 xff0c 发现lottie低版本 xff0c 不适用现
  • 在vue项目中使用Lottie动画(随看随用)

    前言 xff1a Lottie是一个IOS xff0c Android和React Native库 xff0c 可以实时渲染动画 xff0c 动画被转化成JSON文件 xff0c 节省了很多资源 xff0c 允许应用程序像使用静态图像一样轻
  • Android lottie java.lang.IllegalStateException: Missing values for keyframe

    使用Lottie动画的时候 xff0c 运行发现了此报错 xff0c 版本为2 4 0 xff0c 在经过几番的测试后 xff0c 更改了资源文件和xml里面的配置也不大行 tips 一定要在xml里面配置资源文件 xff0c 当你把资源文
  • vue-lottie控制动画的播放、暂停、跳转帧数

    lottie 简介 Lottie适用于Android iOS iOS Web React Native React Native https github com airbnb lottie react native 和Windows Lo
  • 轻松使用 Debian的Linux

    Spiral Linux 就是这样一种发行版 xff0c 它源于 Debian 它的重点在于促进简单性并为最终用户提供开箱即用的特性和功能 如果您是开源操作系统的新手 xff0c 并且想熟悉一个易于使用的 Linux 发行版 xff0c 那
  • 阿里犸良导出的json文件怎么使用

    犸良是什么 犸良作为一站式动效制作平台 通过海量的动效素材以及可视化编辑能力 帮助零基础的用户轻松完成动效制作 支持全平台iOS Android H5 小程序 无论是营销展位 活动页面 空状态还是产品icon 让动效更简单 官网地址 htt
  • Flutter开发之——动画-Lottie

    一 概述 Lottie是Aribnb开源的面向Android iOS等的高性能动画库 Flutter原生库不支持Lottie 但是可以通过第三方插件实现Lottie的动画效果 二 导入lottie flutter插件 2 1 插件地址 Lo
  • 洛蒂和 RecyclerView

    我在用着Lottie https github com airbnb lottie androidRecyclerView 的 ViewHolder 内的动画 滚动时 帧速率太低 即使动画暂停也会发生这种情况 对这个问题有什么建议或解决方案
  • Flutter Web:Lottie 动画在 Android Chrome 上被裁剪,但 Windows Chrome 没问题

    我使用 Lotie 动画 将 Flutter 编译并部署为 Web 应用程序 它在桌面 chrome 上运行良好 但在 android chrome 上运行不佳 有人知道问题所在吗 Flutter Channel 稳定版 3 3 1 在 M
  • Chrome 显示 Lottie 动画模糊

    我遇到了缩放 Lottie 动画的问题 Chrome 模糊了动画 当动画缩放时 这一点尤其明显 在我的示例中 原始动画的尺寸为 842x596px 渲染效果越小 效果越差 如果您想在 Chrome 浏览器中重现它 这里是示例代码 lotti
  • 在 Flutter 中使用 After Effects 文件

    我知道如何导出Rive在 Flutter 应用程序中使用的 Flare 文件 但我怎样才能import Adobe 后遗症文件到 Rive 我知道可以这样做Lottie但我无法弄清楚如何准确地做到这一点 您可以轻松导入 bodymovin
  • 如何在MVVM架构中将animationview play与LottieForms绑定?

    所以我在列表视图中处理动画 并且我想随时播放一次 所以我想控制它 这是图书馆https github com martijn00 LottieXamarin https github com martijn00 LottieXamarin

随机推荐

  • 深度思考Java成员变量的初始化

    写Java代码的时候很少去关注成员变量的声明和初始化顺序 xff0c 今天借此机会抛出一些问题 xff1a 语言的设计者们为什么会这样设计 xff1f 比如说很常见的一个问题 xff1a abstract xff08 抽象 xff09 类不
  • 生产者消费者模型(二)-引入ArrayBlockingQueue

    前言 在 生产者消费者模型你知道多少 中简单的模拟了一个生产者消费者模型 有些网友对我的实现提出了很多质疑 我在文章的结尾也对抛出了一个问题 xff1a 在添加的过程中可能出现数据丢失的情况 xff0c 应该怎么处理 xff1f 在代码中也
  • 存储系统的实现-探析存储的机制和原理

    这一篇主要想写写一些自己对于存储的思考和领悟 xff0c 因为有些东西自己实践过 xff0c 所以感触过更加深一些 xff0c 技术上我还是认为自己实现和看别人的代码在感触上是不同的 这里假设一个图书馆 xff0c 假如说书就是要我们要放的
  • 毕业四年

    直至目前毕业已经快四年 xff0c 我的经历代表了大多数普通程序员的经历 xff0c 没有牛人传奇的经历 xff0c 甚至连进入这个职业都是一种偶然 xff0c 只是因为分数不够被调剂到计算机专业 很多人可能会有和我一样的经历甚至一样的困惑
  • 最佳实践:AtomicInteger实现边界值控制

    最佳实践 xff1a AtomicInteger实现边界值控制 前言 这篇文章主要讲两部分 xff0c 一部分简单的讲了一下AtomicInteger和LongAdder的实现对比 xff0c 这部分不会讲太细 xff0c 因为有更好的文章
  • Java多线程并发锁和原子操作,你真的了解吗?

    前言 对于Java 多线程 xff0c 接触最多的莫过于使用synchronized xff0c 这个简单易懂 xff0c 但是这synchronized并非性能最优的 今天我就简单介绍一下几种锁 可能我下面讲的时候其实很多东西不会特别深刻
  • Huawei 鲲鹏(ARM/Aarch64)服务器安装kvm虚拟机

    硬件 类别 项目 要求 硬件 服务器 TaiShan 200服务器 xff08 型号2280 xff09 CPU 鲲鹏920处理器 RAID卡 Avago 3508 操作系统 项目 要求 银河麒麟 银河麒麟高级服务器操作系统V10 部署KV
  • 我的六年程序之路

    以前看刘未鹏的 我在南大的七年 xff0c 就在感叹每个人的人生迥异 和大牛之间的差距加重了我对自己的卑微 写下这篇日志一方面是为了记录我这和计算机的六年 xff0c 也是缅怀过去 xff0c 反思自己 或许大部分程序员有着一样的迷茫和困惑
  • 深入探析Java线程锁机制

    今天在iteye上提了一个关于 43 43 操作和线程安全的问题 xff0c 一位朋友的回答一言点醒梦中人 xff0c 至此我对Java线程锁有了更加深刻的认识 在这里也做个总结供大家参考 先看几段代码吧 xff01 代码一 xff1a p
  • 喇叭发声原理

    喇叭发声原理 音频设备中负责发出声音的核心部件是扬声器 xff0c 俗称喇叭 xff0c 无论是音响还是耳机 xff0c 其中都少不了这个关键部件 扬声器是一种把电信号转变为声信号的换能器件 喇叭 下面这个喇叭的侧视图能够很好的帮我们了解喇
  • win7 开WiFi共享

    创建 xff08 cmd xff09 xff1a netsh wlan set hostednetwork mode 61 allow ssid 61 user key 61 12345678 在网络连接 本地连接 属性 共享 xff1a
  • 《JAVA开发日常问题》一、修改IDEA路由代码不生效

    一 问题出现 1 重新启动过IDEA xff0c 没有关闭之前的项目 2 重新打开IDEA修改路由代码 xff0c 新增了个路由接口 xff0c 怎么访问都不成功不生效 二 问题排查 1 最开始百度了下 xff0c 说可以删除 idea文件
  • 数据仓库【实时数仓】

    目录 1 数据仓库简介 2 数据仓库的发展 3 数据仓库建设方法论 3 1 面向主题 3 2 为多维数据分析服务 3 3 反范式数据模型 4 数据仓库架构的演变 4 1 离线大数据架构 4 2 Lambda 架构 4 3 Kappa 架构
  • java.lang.IllegalStateException解决合集

    1 跑monkey时报错 xff0c 只定位到了是哪一个模块出的问题 xff0c 但没有定位代码位置 xff0c 大概是指Handler的问题 java lang IllegalStateException The specified me
  • 利用SWIG对C++库进行Python包装

    最近因为项目要求 xff0c 所以大致看了一下swig xff0c 在网上找到一篇不错的文章 xff0c 转载之 xff01 也为自己以后备着 xff01 本文转自http techblog 99fang com p 61 17 利用SWI
  • spring启动过程的追踪(七)——@Autowired注解生效时机、spring创建对象doGetBean方法详细解析、spring三级缓存解决循环依赖

    spring创建Bean得过程非常复杂 xff0c 本文将分段进行解析 xff0c 尽量阐述更加清晰 1 finishBeanFactoryInitialization beanFactory spring创建得单实例对象 xff0c 大部
  • 接口自动化测试接口报405,怎么解决?

    一 405状态码含义 405 Method Not Allowed 解释 xff1a 发起的请求中带有所请求的URL不支持的方法时 xff0c 使用此状态码 应该在响应中包含Allow首部 xff0c 以告知客户端所请求的资源可以使用哪些方
  • 【系统救援】Ubuntu - end Kernel panic - not syncing : VFS: Unable to mount root fs on unknown-block(0,0)

    问题 现象一 xff1a end Kernel panic not syncing VFS Unable to mount root fs on unknown block 0 0 mysql突然访问不上了 xff0c 发现mysql服务宕
  • windows下C++学习推荐书籍

    推荐几本书给你们 xff0c 有空可以学习一下 xff1a C 43 43 编程相关 xff1a 1 C 43 43 Primer xff1a C 43 43 的工具书 2 Effective C 43 43 xff1a C 43 43 提
  • Lottie动画 轻松使用

    Android 敏捷开发助手 Lottie动画 轻松使用PNG JPG等普通图片高保真转SVG图Android 完美的蒙层方案Android MMKV框架引入使用强大无匹的自定义下拉列表Google Protobuf 实践使用开发 Andr