如何优雅的展示动态图标lottie-react-native

2023-11-06 21:20

本文主要是介绍如何优雅的展示动态图标lottie-react-native,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何优雅的展示动态图标lottie-react-native

    • 如何优雅的展示动态图标lottie-react-native
        • 一、Lottie是什么?
        • 二、Lottie能实现什么效果?
        • 三、集成过程
          • 1.安装拉取第三方包:
          • 2.获取json文件
          • 3.组件库的使用
            • Component API:
            • Methods (Imperative API):
        • 四、集成效果图
        • 五、可能遇到的问题
          • 1.Undefined symbol: protocol xxx

项目中,需要使用到动态图标,发现又好用的库,在这里分享一下,需要使用的工具库为lottie-react-native,通过导出AE软件中的动画特效,以json文件的方式导出,来实现动画的效果。

一、Lottie是什么?

Lottie是Airbnb开源的一个支持 Android、iOS 以及 ReactNative,利用Json文件的方式快速实现动画效果的库。简单点说就是Json文件记录动画路径,Android、iOS 以及 ReactNative解析展现出来。

二、Lottie能实现什么效果?

效果



三、集成过程
1.安装拉取第三方包:
yarn add lottie-react-native
yarn add lottie-ios@3.1.3

or

npm i --save lottie-react-native
npm i --save lottie-ios@3.1.3

如果是ios平台,请继续执行下面命令(react-native 版本大于0.60或更高的不需要手动react-native link,而是通过pod install安装依赖):

cd ios && pod install

至此,就完成了第三方包的引入工作。
⚠️:Android平台不需要特殊处理,除非报错崩溃了,请检查以下位置:
a.路径android/app/src/main/java/<AppName>/MainApplication.java

在顶部导入,添加

import com.airbnb.android.react.lottie.LottiePackage;

在 List getPackages();中,添加

packages.add(new LottiePackage()); 

b.路径android/app/build.gradle,dependencies依赖块添加

implementation project(':lottie-react-native') 

c.路径android/settings.gradle添加

include ':lottie-react-native'
project(':lottie-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/lottie-react-native/src/android')
2.获取json文件

这个使用的json文件,是由Adobe After Effects这个软件生成,然后通过其插件bodymovin 生成,同时这里有安装教程,具体导出过程烦请请教UI设计,他们可能会更熟悉。如果实在找不到了,就使用这里的json文件->文件地址

3.组件库的使用

假设我们已经获取到这个animation.json文件了,如下所示最基础的使用方法:

import React from 'react';
import LottieView from 'lottie-react-native';export default class BasicExample extends React.Component {render() {return <LottieView source={require('./animation.json')} autoPlay loop />;}
}

当然,还有其他接口提供使用

import React from 'react';
import LottieView from 'lottie-react-native';export default class BasicExample extends React.Component {componentDidMount() {// 手动控制播放this.animation.play();// 设置特定的开始时间和结束时间this.animation.play(30, 120);}render() {return (<LottieViewref={animation => {this.animation = animation;}}source={require('../path/to/animation.json')}/>);}
}

结合react-native组件Animated实现控制动画播放的过程

import React from 'react';
import { Animated, Easing } from 'react-native';
import LottieView from 'lottie-react-native';export default class BasicExample extends React.Component {constructor(props) {super(props);this.state = {progress: new Animated.Value(0),};}componentDidMount() {Animated.timing(this.state.progress, {toValue: 1,duration: 5000,easing: Easing.linear,}).start();}render() {return (<LottieView source={require('../path/to/animation.json')} progress={this.state.progress} />);}
}

还能够指定的更改图层的颜色

import React from 'react';
import LottieView from 'lottie-react-native';export default class BasicExample extends React.Component {render() {return (<LottieViewsource={require('../path/to/animation.json')}colorFilters={[{keypath: "button",color: "#F00000"},{keypath: "Sending Loader",color: "#F00000"}]}autoPlayloop/>);}
}
Component API:
PropDescriptionDefault
sourceMandatory - The source of animation. Can be referenced as a local asset by a string, or remotely with an object with a uri property, or it can be an actual JS object of an animation, obtained (for example) with something like require('../path/to/animation.json')None
progressA number between 0 and 1, or an Animated number between 0 and 1. This number represents the normalized progress of the animation. If you update this prop, the animation will correspondingly update to the frame at that progress value. This prop is not required if you are using the imperative API.0
speedThe speed the animation will progress. Sending a negative value will reverse the animation1
durationThe duration of the animation in ms. Takes precedence over speed when set. This only works when source is an actual JS object of an animation.undefined
loopA boolean flag indicating whether or not the animation should loop.true
autoPlayA boolean flag indicating whether or not the animation should start automatically when mounted. This only affects the imperative API.false
autoSizeA boolean flag indicating whether or not the animation should size itself automatically according to the width in the animation’s JSON. This only works when source is an actual JS object of an animation.false
styleStyle attributes for the view, as expected in a standard View, aside from border stylingNone
imageAssetsFolderNeeded for Android to work properly with assets, iOS will ignore it.None
onAnimationFinishA callback function which will be called when animation is finished. Note that this callback will be called only when loop is set to false.None
Methods (Imperative API):
MethodDescription
playPlay the animation all the way through, at the speed specified as a prop. It can also play a section of the animation when called as play(startFrame, endFrame).
resetReset the animation back to 0 progress.

更多的接口可以参见:接口参见

四、集成效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、可能遇到的问题
1.Undefined symbol: protocol xxx

在这里插入图片描述
解决方案:
1.在Xcode中打开ios / YourAppName.xcodeproj
2.在左侧的项目浏览器中,右键单击您的应用程序名称,然后单击新建文件…。 为项目创建一个空的Swift文件(添加时请确保选择了target是“您的应用名称”)
3.当Xcode询问时,按Create Bridging Header,然后不要删除Swift文件。重新运行您的构建。
参考地址:
1.https://github.com/mxcl/PromiseKit/issues/1059
2.https://stackoverflow.com/questions/57903395/about-100-error-in-xcode-undefined-symbols-for-architecture-x86-64-upgraded-re
3.Android开发之Lottie动画解析库


在这里插入图片描述

这篇关于如何优雅的展示动态图标lottie-react-native的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/359120

相关文章

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R