动画革命:Lottie如何改变我们对移动应用交互的认知

news2024/9/22 4:15:01

在数字世界的浩瀚星空中,每一个像素都跃动着无限创意与想象的火花。当静态的界面遇上动态的魔法,一场视觉盛宴便悄然开启。今天,让我们一同揭开一位幕后英雄的神秘面纱——Lottie,这个在UI/UX设计界掀起波澜的动画利器,正引领着交互体验的新纪元。

目录

初识Lottie

Lottie基础使用

封装全局Lottie组件


初识Lottie

        Lottie.js是一个JavaScript库,它允许开发者在网页或移动应用中轻松集成由Adobe After Effects(AE)创建的动画,其基于json格式的Bodymovin文件,这些文件是由设计师在AE中创建的动画经过特定插件导出得到的,UI设计师在AE中使用Bodymovin插件将动画导出为json格式的Bodymovin文件,该文件包含了动画的所有关键信息和指令,Lottie.js库能够解析这些json文件,并根据文件中的指令在目标平台上绘制和渲染动画,详情可查阅 官方文档 这里不再赘述。

        初次接触的朋友可以还不知道什么是AE?说白了就是一款由Adobe公司开发的图形视频处理软件,广泛应用于电影、电视、广告、动画、游戏等领域,是后期制作中不可或缺的工具。虽然Lottie本身不直接生成AE动画,但它通过解析由AE导出的json文件来在多种平台上实现动画效果,因此在某种意义上,我们可以将Lottie生成的效果视为AE动画的一种跨平台应用形式,这里直接搜索官方文档进行下载AE工具即可。

        对于前端开发来说,制作AE动画的工作相当于是UI设计师的工作内容了,前端开发没有必要就是花精力去懂得如何制作AE动画,仅仅需要会使用AE动画即可,这里直接前端和UI相互沟通即可,那么对于前端开发来说,没有UI设计师并且也不会AE动画制作但是想在页面上使用AE动画,那该怎么办呢?这里就需要借助网上的一些面试的AE动画资源进行使用即可,这里博主尽量分享一些免费的AE动画网站资源,当然读者们要是有更好的资源欢迎在评论区留言,一个人可以走的很快,但一群人可以走的更远! 分享的网站站点如下

LottieFiles:Lottie的最大赞助商,是世界上最大的免费、即用型、可定制的动画库交互网站,其中世界各地的设计师都可以在其中进行创作,给出 地址

进入控制台之后,可以现在自己选择免费的AE动画然后进行操作:

LottieLab:创建和编辑AE动画的在线工具,易于学习,并充满强大的功能,给出地址:地址

在操作工具台上,我们可以根据现有的功能创建一个属于自己的AE图,然后导出并使用:

Lordicon:是一个不断增长的库,其中充满了精心制作的高质量静态和动画图标,给出 地址

这里我们可以选择免费的AE动画进行下载:

对于AE动画的话,不同的平台可以兼容性不一致,这里我们简单了解一下:地址

当我们下载好AE动画的json文件之后,可以看到里面是一个非常庞大的代码,这段代码其实不重要,我们不需要看懂它,其实里面只是存储了我们的动画数据:

Lottie基础使用

这里我们拿vue进行举例,直接终端执行如下命令进行安装vue3模板的lottie:

npm install vue3-lottie@latest --save

该第三方包对应的参数作用如下所示:

Prop类型默认值描述
animationDataObject{}作为JSON对象提供的lottie动画数据
 animationLinkString''Lottie动画数据的URL链接
widthNumber or String"100%"lottie动画容器的宽度(数字对应像素值)
heightNumber or String"100%"lottie动画容器的高度(数字对应像素值)
speedNumber"1"lottie动画的速度
directionString"forward"动画播放方向
loopNumber or Booleantruelottie动画应该运行的实例数(true为无限)
autoPlayBooleantrue在组件加载时启动动画
delayNumber0延迟动画播放状态几毫秒
pauseOnHoverBooleanfalse是否在悬停时暂停动画
playOnHoverBooleanfalse当鼠标悬停时是否播放动画
 backgroundColorStringtransparent容器的背景颜色
rendererString"svg"设置渲染器

然后我们开始对该插件进行一个使用,如下:

最终呈现的效果如下所示,可以看到我们的浏览器已经渲染出了AE动画了:

        当然vue3-lottie是基于lottie-web的Vue 3组件封装,专为Vue 3项目设计,通过Vue组件的形式提供,可以更方便地在Vue 3项目中使用lottie动画,减少手动设置DOM和监听事件的复杂性。提高了开发效率,开发者可以直接通过 Vue 的模板语法和组件属性来控制动画。

如果想在其他的UI框架中使用lottie的话还是需要安装lottie-web插件的,它不依赖于特定的前端框架,可以在纯 JavaScript 环境中使用,也可以轻松地集成到任何前端框架中,其也提供了丰富的 API 来控制动画的播放、暂停、停止等,适用于需要高度自定义动画行为的场景,安装命令如下:

npm install lottie-web

这里通过一段代码进行一个简单的样式:

<template>
    <div class="box" ref="box" @click="handleClick"></div>
</template>

<script lang="ts" setup>
import { ref, onMounted } from 'vue';
import lottie from 'lottie-web'
import animationData from './assets/lottieFiles/animation1.json';

let box = ref();
let animation = ref();
const initLottie = () => {
  animation.value = lottie.loadAnimation({
    container: box.value, // 绑定dom节点
    renderer: 'svg', // 渲染方式:svg、canvas
    loop: true, // 是否循环播放,默认:false
    autoplay: true, // 是否自动播放, 默认true
    animationData: animationData// AE动画使用bodymovie导出为json数据
  })
}

const handleClick = () => {
  animation.value.pause()
}

onMounted(()=> {
  initLottie()
})
</script>

最终呈现的效果如下所示:

相对来说Lottie的学习成本还是相对较小的,这里我们可以直接在官方文档中翻阅具体的函数:

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

animation.addEventListener('data_ready', () => {}) // 动画数据加载完毕
animation.addEventListener('config_ready', () => {}) // 完成初始配置后
animation.addEventListener('data_failed', () => {}) // 加载动画数据失败
animation.addEventListener('loaded_images', () => {}) // 所有图片加载成功或者失败
animation.addEventListener('DOMLoaded', () => {}) // 将元素添加到DOM后

封装全局Lottie组件

在一个项目中,如果项目中存在多处使用Lottie的情况下,这里就需要将其设置为全局组件进行使用了,为了方便大家使用,这里我将封装的全局组件代码分享如下:

如下代码,我设置了样式、配置文件、事件处理三种情况:

<template>
    <div class="lottie" ref="lottieContainer" :style="handleStyle"></div>
</template>

<script setup lang="ts">
import { ref, computed, onMounted, onBeforeUnmount } from 'vue'
import lottie from 'lottie-web'

// 父组件传递参数
const props = defineProps({
    style: { type: Object, default: ()=> ({
        width: 100 as String | Number,
        height: 100 as String | Number,
        rotate:  0 as String | Number,
        scale: 1 as String | Number,
    })},
    options: { type: Object, default: ()=> ({
        renderer: 'svg', // 'svg' / 'canvas' / 'html' 设置渲染器
        loop: true, // 是否循环播放
        autoplay: true, // 是否自动播放
        animationData: "" // 动画数据
    })}
})
let lottieContainer = ref() // 容器
let animation = ref()  // 动画实例

// 初始化lottie
const initLottie = () => {
  animation.value = lottie.loadAnimation({
    container: lottieContainer.value, // 绑定dom节点
    renderer: props.options.renderer, // 渲染方式:svg、canvas
    loop: props.options.loop, // 是否循环播放,默认:false
    autoplay: props.options.autoplay, // 是否自动播放, 默认true
    animationData: props.options.animationData// AE动画使用bodymovie导出为json数据
  })
}
// 计算属性来动态设置样式
const handleStyle = computed(() => {
    return {
        width: `${props.style.width}px`,
        height: `${props.style.height}px`,
        transform: `rotate(${props.style.rotate}deg) scale(${props.style.scale})`
    }
})
// 点击事件
const handleClick = () => {
    // 判断是否暂停
    if (animation.value.isPaused) {
        animation.value.play()
    } else {
        animation.value.pause()
    }
}

onMounted(()=> initLottie()) // 挂载时初始化
onBeforeUnmount(()=> animation.value && animation.value.destroy()) // 卸载时销毁
defineExpose({
    handleClick
})
</script>

在父组件调用后,只需要传递对应的参数和处理相应的事件即可:

<template>
    <lottie :style="{ width: 200, height: 200, rotate: 80, scale: 0.5 }" :options="options" ref="lottieRef" @click="handleLottie"></lottie>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import lottie from "./components/lottie.vue"
import animationData from './assets/lottieFiles/animation2.json';

let lottieRef = ref();

let options = ref({
  renderer: 'canvas', // 'svg' / 'canvas' / 'html' 设置渲染器
  loop: true, // 是否循环播放
  autoplay: true, // 是否自动播放
  animationData: animationData // 动画数据
})

const handleLottie = () => {
  lottieRef.value.handleClick();
}
</script>

最终呈现的效果如下所示,如下实现了AE动画的样式修改和事件处理

大半夜凌晨了,博主还在写文章,脑壳属实有点小疼了,一些细节懒得说了,目前就想到这么多,上面的全局组件封装的也很简陋,大家有什么想法或者需求的在评论区留言,博主看到了会及时更新文章,尽量满足读者的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1938855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[trick]使用生成器打破嵌套循环

原文 break用于结束循环。但是&#xff0c;如果有嵌套循环&#xff0c;如何跳出外层循环&#xff1f; def this_is_the_one(x):return x 3my_list [[1, 2], [3, 4], [5, 6]] for sublist in my_list:for element in sublist:print(f"Checking {element}")if this_…

农场驿站平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;农场资讯管理&#xff0c;卖家管理&#xff0c;用户分享管理&#xff0c;分享类型管理&#xff0c;商品信息管理&#xff0c;商品分类管理&#xff0c;系统管理&#xff0c;订单管…

天舟飞船可视化:直观体验太空任务全过程

利用图扑先进的 3D 可视化技术&#xff0c;实时展示天舟飞船的发射、对接和任务执行&#xff0c;为观众提供身临其境的太空探索体验。

奥比岛手游攻略:新手攻略大全!云手机辅助!

《奥比岛&#xff1a;梦想国度》是一款画风可爱的Q版休闲益智手游。在这个充满童话色彩的世界里&#xff0c;玩家们可以度过快乐的每一天&#xff0c;结交许多朋友&#xff0c;完成各种任务&#xff0c;体验丰富多彩的游戏玩法。下面将为大家带来详细的攻略大全。 游戏前瞻&…

Java 面试 | Redis

目录 1. 在项目中缓存是如何使用的&#xff1f;2. 为啥在项目中要用缓存&#xff1f;3. 缓存如果使用不当会造成什么后果&#xff1f;4. redis 和 memcached 有什么区别&#xff1f;5. redis 的线程模型是什么&#xff1f;6. 为什么单线程的 redis 比多线程的 memcached 效率要…

Python酷库之旅-第三方库Pandas(035)

目录 一、用法精讲 106、pandas.Series.iloc方法 106-1、语法 106-2、参数 106-3、功能 106-4、返回值 106-5、说明 106-6、用法 106-6-1、数据准备 106-6-2、代码示例 106-6-3、结果输出 107、pandas.Series.__iter__魔法方法 107-1、语法 107-2、参数 107-3、…

Science Robotics 一种使用导电嵌段共聚物弹性体和心理物理阈值来实现准确触觉效果的方法

速读&#xff1a;电触觉刺激作为感官替代的形式存在许多问题&#xff0c;如反应不一致、疼痛和脱敏等问题。加州大学Darren J. Lipomi教授团队研究了一种利用导电嵌段共聚物弹性体和心理物理阈值来实现准确触觉的方法。通过优化材料、设备布局和校准技术&#xff0c;他们在10名…

web服务器——虚拟主机配置实战

搭建静态网站 —— 基于 http 协议的静态网站 实验 1 &#xff1a;搭建一个 web 服务器&#xff0c;访问该服务器时显示 “hello world” 欢迎界面 。 实验 2 &#xff1a;建立两个基于 ip 地址访问的网站&#xff0c;要求如下 该网站 ip 地址的主机位为 100 &#xff0c;设置…

jupyter_contrib_nbextensions安装失败问题

目录 1.文件路径长度问题 2.jupyter不出现Nbextensions选项 1.文件路径长度问题 问题&#xff1a; could not create build\bdist.win-amd64\wheel\.\jupyter_contrib_nbextensions\nbextensions\contrib_nbextensions_help_item\contrib_nbextensions_help_item.yaml: No su…

【强化学习的数学原理】课程笔记--4(随机近似与随机梯度下降,时序差分方法)

目录 随机近似与随机梯度下降Mean estimationRobbins-Monro 算法用 Robbins-Monro 算法解释 Mean estimation用 Robbins-Monro 算法解释 Batch Gradient descent用 SGD 解释 Mean estimation SGD 的一个有趣的性质 时序差分方法Sarsa 算法一个例子 Expected Sarsa 算法n-step S…

LLM基础模型系列:Prefix-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ Prefix Tuning和Prompt Tuning最大的区别就是向每层的Transformer Block添加可训练的张量&#xff0c;而上一期的Prompt Tuning只是在输入的时候添加。 此外&#xff0c;通过全连接层&a…

【BUG】已解决:ModuleNotFoundError: No module named ‘sklearn‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘sklearn‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named ‘sklearn‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是…

模型剪枝入门

一、定义 1.定义 2. 案例1 3. 全局剪枝案例 4. 全局剪枝案例 5. 自定义剪枝 6. 特定网络剪枝 7. 多参数模块剪枝 8. torch.nn.utils.prune 解读 二、实现 定义 接口&#xff1a; import torch.nn.utils.prune as prune案例1 import torch.nn as nn import torch.nn.utils.…

深入理解Linux网络(二):UDP接收内核探究

深入理解Linux网络&#xff08;二&#xff09;&#xff1a;UDP接收内核探究 一、UDP 协议处理二、recvfrom 系统调⽤实现 一、UDP 协议处理 udp 协议的处理函数是 udp_rcv。 //file: net/ipv4/udp.c int udp_rcv(struct sk_buff *skb) {return __udp4_lib_rcv(skb, &udp_…

IntelliJ IDEA 直接在软件中更新为最新版

当我们的 IDEA 工具许久没有更新&#xff0c;已经拖了好几个版本&#xff0c;想跨大版本更新&#xff0c;比如从2020.2.1 -> 2023.x.x 此时&#xff0c;我们菜单栏点击 Help -> Check for Updates… &#xff0c;右下角会有提示更新&#xff0c;如下图&#xff1a; 点…

【深大计算机系统(2)】实验一 实验环境配置与使用 附常用指令

目录 一、 实验目标&#xff1a; 二、实验环境与工件&#xff1a; 三、实验内容与步骤 1. 学习并熟悉Linux基本操作&#xff0c;按照要求创建用户。&#xff08;30分&#xff09; 2.新建用户主目录下创建子目录&#xff1a;gdbdebug&#xff0c;并进入gdbdebug子目录。将过程和…

亲测--linux下安装ffmpeg最新版本---详细教程

下载地址 Download FFmpeg 下载最新的https://ffmpeg.org/releases/ffmpeg-7.0.1.tar.xz 上传到服务器 解压 tar xvf ffmpeg-7.0.1.tar.xz 编译 cd ffmpeg-7.0.1 ./configure --prefix=/usr/local/ffmpeg make && make install 报错: 解决:在后面加 跳过检测…

粉尘传感器助力面粉厂安全生产

在面粉加工行业中&#xff0c;粉尘问题一直是一个不容忽视的难题。从原料的破碎、研磨到成品的包装&#xff0c;整个生产流程中都会伴随着大量的粉尘产生。这些粉尘不仅影响生产环境&#xff0c;更对工作人员的健康、设备的安全运行以及环境保护构成严重威胁。因此&#xff0c;…

【Unity实战100例】Unity声音可视化多种显示效果

目录 一、技术背景 二、界面搭建 三、 实现 UIAudioVisualizer 基类 四、实现 AudioSampler 类 五、实现 IAudioSample 接口 六、实现MusicAudioVisualizer 七、实现 MicrophoneAudioManager 类 八、实现 MicrophoneAudioVisualizer 类 九、源码下载 Unity声音可视化四…

云计算数据中心(三)

目录 四、自动化管理&#xff08;一&#xff09;自动化管理的特征&#xff08;二&#xff09;自动化管理实现阶段&#xff08;三&#xff09;Facebook自动化管理 五、容灾备份&#xff08;一&#xff09;容灾系统的等级标准&#xff08;二&#xff09;容灾备份的关键技术&#…