说lottie谁是lottie?

简介: 说lottie谁是lottie?

背景


在项目中, 常用的动画方案是 Gif 动画,Gif 动画存在一些问题,例如:文件较大、无法缩放匹配不同屏幕大小和密度、易出现锯齿、无法控制动画等。其他常用的动画方案有:

  • PNG序列帧:文件大,可能会在不同屏幕分辨率下失真
  • SVG动画:实现成本高,易出现动画还原度低的情况

目前,项目需要经过调研,Lottie 动画是一种具有高可行性的方案。

image.png

Lottie 简介


Lottie 是 airbnb 开源的动画库,支持多个平台如 Android、iOS、Web、React Native 和 Windows。其提供从 AE 到各终端的完整工具流程。设计师可以通过 AE 的 Bodymovin 插件将动画导出为 json 文件,然后通过 Lottie 实现动画效果确保动画的还原度

lottie实现的动画效果:

image.png


lottie-web


lottie-web 支持多种特性,提供复杂的动画控制和监听功能。

使用示例如下:

lottie.loadAnimation({
  container: animationWindow,
  renderer: 'svg',
  loop: true,
  autoplay: true,
  path: 'https://linwu-hi.github.io/lottie/animation_ll2ddfyg.json'
});

image.png

控制动画播放的方法:

名称 描述
animation.play 播放该动画,从目前停止的帧开始播放
stop 停止播放该动画,回到第 0 帧
pause 暂停该动画,在当前帧停止并保持
goToAndStop animation.goToAndStop(value, isFrame);跳到某个时刻/帧并停止。isFrame(默认 false)指示 value 表示帧还是时间(毫秒)
goToAndPlay animation.goToAndPlay(value, isFrame);跳到某个时刻/帧并进行播放
goToAndStop animation.goToAndStop(30, true);跳转到第 30 帧并停止
playSegments animation.playSegments(arr, forceFlag);arr 可以包含两个数字或者两个数字组成的数组,forceFlag 表示是否立即强制播放该片段 animation.playSegments([10,20], false);播放完之前的片段,播放 10-20 帧 animation.playSegments([[0,5],[10,18]], true);直接播放 0-5 帧和 10-18 帧
setSpeed animation.setSpeed(speed);设置播放速度,speed 为 1 表示正常速度
setDirection animation.setDirection(direction);设置播放方向,1 表示正向播放,-1 表示反向播放
destroy animation.destroy();删除该动画,移除相应的元素标签等。在 unmount 的时候,需要调用该方法

监听事件:

名称 描述
data_ready 加载完 json 动画
complete 播放完成(循环播放下不会触发)
loopComplete 当前循环下播放(循环播放/非循环播放)结束时触发
enterFrame 每进入一帧就会触发,播放时每一帧都会触发一次,stop 方法也会触发
segmentStart 每进入一帧就会触发,播放时每一帧都会触发一次,stop 方法也会触发
DOMLoaded 动画相关的 dom 已经被添加到 html 后触发
destroy 将在动画删除时触发


Lottie 动画性能


image.png

对比 Lottie 和 Gif 动画,数据显示 Lottie 动画文件更小,帧率更高,而且其性能表现更好。

  • GIF动图

image.png

  • Lottie动画

image.png


react-lottie


react-lottie 将 lottie-web 封装成 React 组件,使其更加易于在 React 中使用。

import React from 'react'
import Lottie from 'react-lottie';
import * as animationData from './pinjump.json'
 
export default class LottieControl extends React.Component {
 
  constructor(props) {
    super(props);
    this.state = {isStopped: false, isPaused: false};
  }
 
  render() {
    const buttonStyle = {
      display: 'block',
      margin: '10px auto'
    };
 
    const defaultOptions = {
      loop: true,
      autoplay: true, 
      animationData: animationData,
      rendererSettings: {
        preserveAspectRatio: 'xMidYMid slice'
      }
    };
 
    return <div>
      <Lottie options={defaultOptions}
              height={400}
              width={400}
              isStopped={this.state.isStopped}
              isPaused={this.state.isPaused}/>
      <button style={buttonStyle} onClick={() => this.setState({isStopped: true})}>stop</button>
      <button style={buttonStyle} onClick={() => this.setState({isStopped: false})}>play</button>
      <button style={buttonStyle} onClick={() => this.setState({isPaused: !this.state.isPaused})}>pause</button>
    </div>
  }
}


vue-lottie


vue-lottie 将 lottie-web 封装成 vue 组件,使其更加易于在 vue 中使用。

也有vue3-lottie

<template>
    <div id="app">
        <lottie :options="defaultOptions" :height="400" :width="400" v-on:animCreated="handleAnimation"/>
        <div>
            <p>Speed: x{{animationSpeed}}</p>
            <input type="range" value="1" min="0" max="3" step="0.5"
                   v-on:change="onSpeedChange" v-model="animationSpeed">
        </div>
        <button v-on:click="stop">stop</button>
        <button v-on:click="pause">pause</button>
        <button v-on:click="play">play</button>
    </div>
</template>
 
<script>
  import Lottie from './lottie.vue';
  import * as animationData from './assets/pinjump.json';
 
  export default {
    name: 'app',
    components: {
      'lottie': Lottie
    },
    data() {
      return {
        defaultOptions: {animationData: animationData},
        animationSpeed: 1
      }
    },
    methods: {
      handleAnimation: function (anim) {
        this.anim = anim;
      },
 
      stop: function () {
        this.anim.stop();
      },
 
      play: function () {
        this.anim.play();
      },
 
      pause: function () {
        this.anim.pause();
      },
 
      onSpeedChange: function () {
        this.anim.setSpeed(this.animationSpeed);
      }
    }
  }
</script>

目录
相关文章
|
JSON 缓存 Android开发
iOS高质量的动画实现解决方案——Lottie
iOS高质量的动画实现解决方案——Lottie
1456 0
|
缓存 中间件 API
【利用AI让知识体系化】入门Egg框架(含实战)(三)
【利用AI让知识体系化】入门Egg框架(含实战)
|
1月前
|
编解码 UED 开发者
UI&UE设计规范
本文档为移动端开发人员结合十年经验与UI/UE实践总结的设计规范,涵盖设计原则、字体、配色、布局及组件使用标准,旨在统一产品视觉语言,提升用户体验与团队协作效率,适用于产品经理、设计师及开发者。
192 0
UI&UE设计规范
|
存储 UED 算法
|
6月前
|
消息中间件 Java 微服务
2025 版 Java 学习路线实战指南从入门到精通
《Java学习路线实战指南(2025版)》是一份全面的Java开发学习手册,涵盖基础环境搭建、核心语法与新特性、数据结构与算法、微服务架构、云原生技术栈、AI融合及项目实战。内容包括JDK安装配置、IntelliJ IDEA设置、Records类与模式匹配增强、LeetCode题解、Spring Cloud微服务开发、Kubernetes部署、OpenAI API调用等。结合在线商城系统案例,采用Vue 3、Spring Boot 3.5、MySQL、Elasticsearch等技术,提供从理论到实践的完整路径,助力开发者掌握2025年最新趋势与最佳实践。
571 4
|
安全 数据安全/隐私保护 UED
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
### HarmonyOS 5.0(Next)应用开发实战:使用ArkTS构建开箱即用的登录页面 HarmonyOS 5.0(Next)融合了美学与科技,引入“光感美学”设计理念和多设备深度协同功能。本文通过 ArkTS 构建一个简单的登录页面,展示了模块化导入、状态管理、方法封装、声明式UI构建及事件处理等最佳实践。代码实现了一个包含用户名和密码输入框及登录按钮的界面,支持错误提示和页面跳转。
1128 14
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
|
JavaScript
Vue3数值动画(NumberAnimation)
该文档介绍了一个基于 Vue 的数值动画组件 `NumberAnimation`,提供了丰富的配置选项,如起始值、目标值、动画时长等,并支持自定义前缀、后缀及样式。通过简单的方法和事件,可以轻松控制动画的播放与停止。
581 0
Vue3数值动画(NumberAnimation)
|
网络协议 安全 Unix
什么是 Banner 抓取和 OS 指纹识别?
【8月更文挑战第31天】
558 0
|
存储 数据采集 数据可视化
深入解析GPS接收机的位置数据文件:项目实战从数据解析到可视化
全球定位系统(GPS)是现代技术的支柱之一,广泛应用于交通导航、科学研究、智能设备等领域。GPS接收机通过接收来自卫星的信号,确定设备的地理位置,并将这些位置信息记录在数据文件中。 这些数据文件通常包含大量的信息,如时间、位置、海拔高度、卫星状态等。本篇文章将通过解析这些数据文件,展示如何利用Python和Folium库实现数据的读取、处理和可视化,帮助读者深入理解GPS数据的处理过程。
|
安全 IDE Java
终结空指针异常:Java开发者的生存指南
终结空指针异常:Java开发者的生存指南
516 1