说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
1782 0
|
Web App开发 数据可视化 前端开发
测试篇:性能监测之Performance、LightHouse 与性能 API
测试篇:性能监测之Performance、LightHouse 与性能 API
测试篇:性能监测之Performance、LightHouse 与性能 API
|
6月前
|
人工智能 芯片
万相2.7,模型使用指南
万相2.7,拥有全面的创作控制力,将AI的能力从单一素材生成扩至创作全链路,从“演”迈向“导” 。
1013 11
万相2.7,模型使用指南
|
消息中间件 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年最新趋势与最佳实践。
992 4
|
前端开发 JavaScript 测试技术
前端工程化:构建高效、可维护的现代Web应用
【10月更文挑战第5天】前端工程化:构建高效、可维护的现代Web应用
|
存储 编解码 UED
拥抱AVIF:提升网站加载速度的最佳实践,附Zola模板
AVIF(AV1图像文件格式)是一种高效、开源且免版税的图片格式,相比JPG和PNG,在视觉相似的压缩水平下,文件大小可减少50%。它支持有损与无损压缩、动画存储、Alpha通道、HDR及宽色域等特性。2024年起,现代浏览器已全面支持AVIF。通过使用HTML `<picture>`标签,可优先加载AVIF图片,同时兼容WebP格式,提升网站性能与用户体验。本文还分享了在Zola静态网站生成器中实现AVIF支持的方法,大幅降低图片文件体积,优化带宽与流量成本,实现技术升级与用户需求的双赢。
1970 0
TortoiseSVN使用-TortoiseSVN更换或重置登录用户
TortoiseSVN使用-TortoiseSVN更换或重置登录用户
1101 5
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
1030 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
JavaScript
Vue3数值动画(NumberAnimation)
该文档介绍了一个基于 Vue 的数值动画组件 `NumberAnimation`,提供了丰富的配置选项,如起始值、目标值、动画时长等,并支持自定义前缀、后缀及样式。通过简单的方法和事件,可以轻松控制动画的播放与停止。
926 0
Vue3数值动画(NumberAnimation)