Android 动画 Lottie 如何使用

这篇具有很好参考价值的文章主要介绍了Android 动画 Lottie 如何使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android 动画 Lottie 如何使用

一、简介

Lottie 是Airbnb开源的一个面向 iOS、Android、React Native 的动画库,能分析 Adobe After Effects 导出的动画,并且能让原生 App 像使用静态素材一样使用这些动画,完美实现动画效果。

二、Lottie动画文件制作

1.让设计师使用Adobe 的 After Effects(简称 AE)工具(美工一般都会这个)制作这个动画。

2.在AE中安装一个叫做Bodymovin的插件。下载 bodymovin,解压缩后只需要\build\extension\bodymovin.zxp这个档案就可以

lottie动画,android

3.手动安装plugin,以windows系统而言,要先下载 **ExMan Command Line tool **并解压缩。 再来把下载的bodymovin压缩后的 bodymovin-master\build\extension 目录下的bodymovin.zxp 这个档案复制进去同一个资料夹。

lottie动画,android

4.去找cmd,并以系统管理员身分执行。

5.打“cd C:/ExManCmd_win 所在的路径“,进入ExManCmd的资料夹中

6.接着打 ExManCmd.exe /install bodymovin.zxp 就完

lottie动画,android

7.再来进入AE 后,可以在windows/extentions/bodymovin 找到插件,开启后按下Render 就完成了。 重点来了,这时会在你选的Destination Folder目录中生成一个json格式的文件,这个 json 文件描述了该动画的一些关键点的坐标以及运动轨迹。

lottie动画,android

三、如何使用Lottie

Lottie支持多平台,使用同一个JSON动画文件,可在不同平台实现相同的效果。支持Android,ios,前段。

1.依赖

在项目的 build.gradle 文件添加依赖

dependencies {  
  compile 'com.airbnb.android:lottie:2.1.0'
}

2.动画文件

第一种方法,将我们所需要的动画文件loading.json保存在app/src/main/assets文件里。 第二种方法,网络上AE生成的动画文件。

3.使用

在布局文件中使用

<com.airbnb.lottie.LottieAnimationView
        android:id="@+id/animation_view"
        android:layout_width="400dp"
        android:layout_height="400dp"
        app:lottie_fileName="loading.json"
        app:lottie_loop="true"
        app:lottie_autoPlay="true"/>

使用网络加载AE生成的动画文件json

private void loadUrl(String url) {
    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()) {
                try {
                    JSONObject json = new JSONObject(response.body().string());
                    LottieComposition.Factory
                            .fromJson(getResources(), json, new OnCompositionLoadedListener() {
                                @Override
                                public void onCompositionLoaded(LottieComposition composition) {
                                    setComposition(composition);
                                }
                            });
                } catch (JSONException e) {
                }
            }
        }
    });
}

private  void setComposition(LottieComposition composition){
    animation_view.setProgress(0);
    animation_view.loop(true);
    animation_view.setComposition(composition);
    animation_view.playAnimation();
}

四、Lottie实现原理

lottie动画,android

设计师把一张复杂的图片使用多个图层来表示,每个图层展示一部分内容,图层中的内容也可以拆分为多个元素。拆分元素之后,根据动画需求,可以单独对图层或者图层中的元素做平移、旋转、收缩等动画。

Lottie的使用的资源是需要先通过bodymovin( bodymovin 插件本身是用于网页上呈现各种AE效果的一个开源库)将 Adobe After Effects (AE)生成的aep动画工程文件转换为通用的json格式描述文件。Lottie则负责解析动画的数据,计算每个动画在某个时间点的状态,准确地绘制到屏幕上。

Lottie主要类图:

lottie动画,android

Lottie对外通过控件LottieAnimationView暴露接口,控制动画。

LottieAnimationView继承自ImageView,通过当前时间绘制canvas显示到界面上。这里有两个关键类:LottieComposition 负责解析json描述文件,把json内容转成Java数据对象;LottieDrawable负责绘制,把LottieComposition转成的数据对象绘制成drawable显示到View上。顺序如下:

lottie动画,android

解析json外部结构LottieComposition封装整个动画的信息,包括动画大小,动画时长,帧率,用到的图片,字体,图层等等。

{
    "v": "4.6.0",               //bodymovin的版本
    "fr": 29.9700012207031,     //帧率
    "ip": 0,                    //起始关键帧
    "op": 141.000005743048,     //结束关键帧
    "w": 800,                   //动画宽度
    "h": 800,                   //动画高度
    "ddd": 0, 
    "assets": [...]             //资源信息
    "layers": [...]             //图层信息
}

解析图片资源

"assets": [                 //资源信息
    {                       //第一张图片
        "id": "image_0",    //图片id
        "w": 58,            //图片宽度
        "h": 31,            //图片高度
        "u": "images/",     //图片路径
        "p": "img_0.png"    //图片名称
    },
    {...}                   //第n张图片
]

解析图层

"layers": [                 //图层信息
    {                       //第一层动画
        "ddd": 0, 
        "ind": 0,           //layer id 图层 id
        "ty": 4,            //图层类型
        "nm": "center_circle", 
        "ks": {...},        //动画
        "ao": 0, 
        "shapes": [...], 
        "ip": 0,            //inFrame 该图层起始关键帧
        "op": 90,           //outFrame 该图层结束关键帧
        "st": 0,            //startFrame 开始
        "bm": 0, 
        "sr": 1
    }, 
    {...}                   //第n层动画
]

如何动起来时序图

lottie动画,android

利用属性动画控制进度,每次进度改变通知到每一层,触发LottieAnimationView重绘。代码如下:

public LottieDrawable() {
    animator.setRepeatCount(0);
    animator.setInterpolator(new LinearInterpolator());
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            if (systemAnimationsAreDisabled) {
                animator.cancel();
                setProgress(1f);
            } else {
                setProgress((float) animation.getAnimatedValue());
            }
        }
    });
}

通过CompositionLayer把进度传递到各个图层

@Override
public void setProgress(@FloatRange(from = 0f, to = 1f) float progress) {
    super.setProgress(progress);
    if (timeRemapping != null) {
        long duration = lottieDrawable.getComposition().getDuration();
        long remappedTime = (long) (timeRemapping.getValue() * 1000);
        progress = remappedTime / (float) duration;
    }
    if (layerModel.getTimeStretch() != 0) {
        progress /= layerModel.getTimeStretch();
    }
    progress -= layerModel.getStartProgress();
    for (int i = layers.size() - 1; i >= 0; i--) {
        layers.get(i).setProgress(progress);
    }
}

通知进度改变

void setProgress(@FloatRange(from = 0f, to = 1f) float progress) {
    if (progress < getStartDelayProgress()) {
      progress = 0f;
    } else if (progress > getEndProgress()) {
      progress = 1f;
    }

    if (progress == this.progress) {
      return;
    }
    this.progress = progress;

    for (int i = 0; i < listeners.size(); i++) {
      listeners.get(i).onValueChanged();
    }
  }

最终回调到LottieAnimationView的invalidateDrawable

@Override
public void invalidateDrawable(@NonNull Drawable dr) {
    if (getDrawable() == lottieDrawable) {
      // We always want to invalidate the root drawable so it redraws the whole drawable.
      // Eventually it would be great to be able to invalidate just the changed region.
        super.invalidateDrawable(lottieDrawable);
    } else {
      // Otherwise work as regular ImageView
        super.invalidateDrawable(dr);
    }
}

最后触发LottieDrawable重绘

@Override
public void draw(@NonNull Canvas canvas) {
    ...
    matrix.reset();
    matrix.preScale(scale, scale);
    compositionLayer.draw(canvas, matrix, alpha);   //这里会调用所有layer的绘制方法
    if (hasExtraScale) {
        canvas.restore();
    }
}

总结

1.劣势
(1)性能不够好—某些动画特效,内存和性能不够好;相对于属性动画,在展示大动画时,帧率较低


2.优势
(1)开发效率高—代码实现简单,更换动画方便,易于调试和维护。
(2)数据源多样性—可从assets,sdcard,网络加载动画资源,能做到不发版本,动态更新
(3)跨平台—设计稿导出一份动画描述文件,android,ios,react native通用
(4) Lottie使用简单,易于上手,非常值得尝试。文章来源地址https://www.toymoban.com/news/detail-858386.html

到了这里,关于Android 动画 Lottie 如何使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3+vite中使用Lottie动画

    Lottie通过读取json文件信息实现动画效果   官方文档 Lottie官网 lottie库有众多动画 选择下载Lottie JSON到项目中 安装Lottie包 pnpm add lottie-web 模板创建  引入lottie-web以及动画json文件 import lottie from \\\'lottie-web\\\'; import transformJson from \\\"@/assets/json/playLottie.json\\\" js   动画生成!!! 

    2024年02月07日
    浏览(35)
  • Lottie动画的优劣及原理

    Lottie是目前应用十分广泛的动画框架。在周会汇报的时候,老板问能不能对Lottie进行优化,于是就有了下文对Lottie原理的研究。毕竟要进行优化,首先要深入了解原理嘛。 Lottie通过读取json文件信息实现动画效果。 json信息包括json整体结构、图片资源、图层信息等,这些属性

    2024年02月05日
    浏览(39)
  • OpenHarmony UI动画-lottie

    lottie是一个适用于OpenHarmony的动画库,它可以解析Adobe After Effects软件通过Bodymovin插件导出的json格式的动画,并在移动设备上进行本地渲染。 OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包 前提:数据准备 lottie动画文件是由设计人员使用Adobe After Effects软件

    2024年04月28日
    浏览(37)
  • 微信小程序使用lottie-miniprogram插件。显示json格式的动画,手机上锯齿模糊问题

    https://github.com/wechat-miniprogram/lottie-miniprogram 使用办法 通过 npm 安装: 传入 canvas 对象用于适配

    2024年02月11日
    浏览(57)
  • 微信小程序通过lottie库实现json动画

    通过npm安装Lottie库(注意微信小程序使用lottie-miniprogram,vue项目使用 lottie-web) 把ui提供的json文件动画改成js文件并通过module.exports导出文件 在页面wxml文件创建一个canvas标签来存放动画(注意这里canvas需要包裹在view标签中并设置 style=\\\"width: 100%;height: 100%;) 在页面ts文件中使用

    2024年02月11日
    浏览(41)
  • 微信小程序使用lottie动图插件

    1、通过npm安装Lottie库 npm install --save lottie-miniprogram 2、npm 构建 1)npm init 2)微信开发者工具中 点击  工具一构建npm 3、js文件里引用 4、wxml文件使用canvas 5、js方法调用      注:json路径为小程序合法域名下服务器上的文件,可将文件夹整体扔到服务器上 6、效果展示

    2024年02月04日
    浏览(39)
  • Android 使用motion 动画如何使用

    MotionLayout 是 Android 中的一个强大的布局容器,它可以用来创建复杂的动画和过渡效果,允许你在布局中定义多个状态,并在这些状态之间进行平滑的动画过渡。以下是使用 MotionLayout 创建动画的基本步骤: 1. 添加依赖: 首先,确保在你的 app 模块的 build.gradle 文件中添加以下

    2024年02月09日
    浏览(40)
  • Android Activity 动画如何实现

    在 Android 中,你可以使用 Activity 转场动画来实现 Activity 之间的切换动画效果。以下是一些常见的 Activity 转场动画的实现方法: 1. 使用 XML 文件定义动画效果: 首先,在 res/anim 目录下创建 XML 文件来定义你的动画效果。例如,你可以创建 fade_in.xml 和 fade_out.xml 文件来定义淡入

    2024年02月09日
    浏览(49)
  • Android View动画之LayoutAnimation的使用

    接前篇 Android View动画整理 ,本篇介绍 LayoutAnimation 的使用。 参考《安卓开发艺术探索》。 View 动画作用于 View 。 LayoutAnimation 则作用于 ViewGroup , 为 ViewGoup 指定一个动画,ViewGoup 的子 View 出场时就具体动画效果。 简言之,LayoutAnimation 是为 ViewGroup 的子View指定出场动画。 开

    2024年02月11日
    浏览(41)
  • 腾讯出品Pag动画框架在Android端的使用-网络Pag加载

    在我们可以通过assets的方式加在pag文件之后,我们会考虑下一个问题,可不可以用Pag框架加载网络文件? 为什么会有这样的问题出现,或者说网络方式加载可以解决什么问题? APK 体积增加问题 当一个项目规模比较大的时候,会做很多优化工作,其中「APK瘦身」便是一项优化

    2024年02月13日
    浏览(89)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包