React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现
在移动应用中,动画效果 是提升用户体验的重要手段。合理的动画设计可以增强应用的交互性、流畅性和视觉吸引力。React Native 提供了多种实现动画的方式,包括内置的 Animated
API、LayoutAnimation
以及第三方库(如 react-native-reanimated
)。本章节将详细介绍如何使用这些工具来实现各种动画效果。
1.1 动画概述
在 React Native 中,动画主要用于以下场景:
- 组件的显示与隐藏: 例如,模态框的弹出与关闭。
- 界面元素的过渡: 例如,页面切换时的过渡动画。
- 交互反馈: 例如,按钮点击时的缩放效果。
- 数据驱动的动画: 例如,图表、进度条等动态变化。
React Native 提供了以下几种主要的动画实现方式:
Animated
API: 强大的动画库,支持多种动画类型和插值。LayoutAnimation
: 简单的布局动画,适用于布局变化时的动画效果。react-native-reanimated
: 第三方动画库,功能更强大,适合复杂动画。
本章节将重点介绍 Animated
API 和 LayoutAnimation
的使用。
1.2 使用 Animated
API
Animated
是 React Native 提供的一个强大的动画库,支持多种动画类型和插值操作。
1.2.1 基本用法
步骤:
-
创建动画值:
使用
Animated.Value
创建一个动画值。const animation = useRef(new Animated.Value(0)).current;
-
定义动画:
使用
Animated.timing
或其他动画函数定义动画。Animated.timing(animation, {toValue: 1,duration: 1000,useNativeDriver: true, }).start();
-
绑定动画值到样式:
使用插值函数将动画值绑定到组件的样式属性。
const opacity = animation.interpolate({inputRange: [0, 1],outputRange: [0, 1], });<Animated.View style={{ opacity }}>{/* 内容 */} </Animated.View>
示例:
// FadeInView.js
import React, { useRef } from 'react';
import { Animated, Text, View, StyleSheet } from 'react-native';const FadeInView = () => {const animation = useRef(new Animated.Value(0)).current;React.useEffect(() => {Animated.timing(animation, {toValue: 1,duration: 1000,useNativeDriver: true,}).start();}, [animation]);const opacity = animation.interpolate({inputRange: [0, 1],outputRange: [0, 1],});return (<Animated.View style={{ opacity }}><Text style={styles.text}>Fade In!</Text></Animated.View>);
};const styles = StyleSheet.create({text: {fontSize: 18,},
});export default FadeInView;
// App.js
import React from 'react';
import { View, StyleSheet } from 'react-native';
import FadeInView from './FadeInView';const App = () => {return (<View style={styles.container}><FadeInView /></View>);
};const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',},
});export default App;
解释:
Animated.timing
定义了一个从0
到1
的线性动画,持续时间为1000
毫秒。useNativeDriver: true
使用原生驱动,提高动画性能。interpolate
方法将动画值从0-1
映射到0-1
的透明度范围。
1.2.2 组合动画
可以使用 Animated.sequence
, Animated.parallel
, Animated.stagger
等组合动画函数,实现复杂的动画效果。
示例:
// BounceView.js
import React, { useRef } from 'react';
import { Animated, Text, View, StyleSheet } from 'react-native';const BounceView = () => {const animation = useRef(new Animated.Value(0)).current;React.useEffect(() => {Animated.sequence([Animated.timing(animation, {toValue: 1,duration: 500,useNativeDriver: true,}),Animated.timing(animation, {toValue: 0.8,duration: 300,useNativeDriver: true,}),Animated.timing(animation, {toValue: 1,duration: 300,useNativeDriver: true,}),]).start();}, [animation]);const scale = animation.interpolate({inputRange: [0, 1],outputRange: [0.5, 1],});return (<Animated.View style={{ transform: [{ scale }] }}><Text style={styles.text}>Bounce!</Text></Animated.View>);
};const styles = StyleSheet.create({text: {fontSize: 18,},
});export default BounceView;
解释:
Animated.sequence
按顺序执行多个动画。- 实现了先放大再缩小再恢复的弹跳效果。
1.2.3 插值与映射
interpolate
方法可以将动画值映射到不同的范围,实现复杂的动画效果。
示例:
// ColorChangeView.js
import React, { useRef } from 'react';
import { Animated, Text, View, StyleSheet } from 'react-native';const ColorChangeView = () => {const animation = useRef(new Animated.Value(0)).current;React.useEffect(() => {Animated.timing(animation, {toValue: 1,duration: 2000,useNativeDriver: false,}).start();}, [animation]);const backgroundColor = animation.interpolate({inputRange: [0, 1],outputRange: ['#ff0000', '#0000ff'],});return (<Animated.View style={{ backgroundColor, padding: 20 }}><Text style={styles.text}>Color Change!</Text></Animated.View>);
};const styles = StyleSheet.create({text: {fontSize: 18,color: '#fff',},
});export default ColorChangeView;
解释:
interpolate
将动画值从0-1
映射到颜色范围#ff0000
到#0000ff
,实现颜色渐变动画。
1.3 使用 LayoutAnimation
LayoutAnimation
是一种简单的布局动画,适用于布局变化时的动画效果。
1.3.1 基本用法
步骤:
-
调用
LayoutAnimation.configureNext
配置动画:LayoutAnimation.configureNext({duration: 300,create: {type: LayoutAnimation.Types.easeInEaseOut,property: LayoutAnimation.Properties.opacity,},update: {type: LayoutAnimation.Types.easeInEaseOut,}, });
-
触发布局变化:
例如,更新组件的
state
或props
,触发重新渲染。
示例:
// LayoutAnimationExample.js
import React, { useState } from 'react';
import { View, Text, StyleSheet, LayoutAnimation, Button } from 'react-native';const LayoutAnimationExample = () => {const [show, setShow] = useState(false);const toggle = () => {LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);setShow(!show);};return (<View style={styles.container}><Button title="Toggle" onPress={toggle} />{show && (<View style={styles.box}><Text>Hello, LayoutAnimation!</Text></View>)}</View>);
};const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',},box: {width: 200,height: 200,backgroundColor: '#f0f0f0',marginTop: 20,justifyContent: 'center',alignItems: 'center',},
});export default LayoutAnimationExample;
解释:
LayoutAnimation.configureNext
配置布局动画。LayoutAnimation.Presets.easeInEaseOut
使用预设的缓入缓出动画。- 当
show
状态改变时,触发布局变化,动画效果自动应用。
1.3.2 注意事项
LayoutAnimation
适用于简单的布局变化动画,不适合复杂的动画效果。LayoutAnimation
不支持动画暂停、停止等高级控制。
1.4 使用 react-native-reanimated
react-native-reanimated
是一个功能强大的动画库,支持复杂的动画效果和手势交互。
1.4.1 安装 react-native-reanimated
npm install react-native-reanimated
1.4.2 基本用法
示例:
// ReanimatedExample.js
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import Animated, { useSharedValue, useAnimatedStyle, withTiming } from 'react-native-reanimated';const ReanimatedExample = () => {const offset = useSharedValue(0);const animatedStyle = useAnimatedStyle(() => {return {transform: [{ translateY: offset.value }],};});React.useEffect(() => {offset.value = withTiming(100, { duration: 1000 });}, [offset]);return (<View style={styles.container}><Animated.View style={[styles.box, animatedStyle]}><Text>Reanimated!</Text></Animated.View></View>);
};const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',},box: {width: 200,height: 200,backgroundColor: '#f0f0f0',justifyContent: 'center',alignItems: 'center',},
});export default ReanimatedExample;
解释:
useSharedValue
创建一个共享的动画值。useAnimatedStyle
定义动画样式。withTiming
定义动画的时间和持续时间。
1.4.3 高级用法
react-native-reanimated
支持手势驱动、弹簧动画、弹簧驱动等高级功能。
这部分留给读者自行学习,用法基本上和基本例子一致。
导师简介
前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!
温馨提示:可搜老码小张公号联系导师
相关文章:

React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现
在移动应用中,动画效果 是提升用户体验的重要手段。合理的动画设计可以增强应用的交互性、流畅性和视觉吸引力。React Native 提供了多种实现动画的方式,包括内置的 Animated API、LayoutAnimation 以及第三方库(如 react-native-reanimated&…...

【CICD】GitLab Runner 和执行器(Executor
GitLab Runner 和执行器(Executor)是 GitLab CI/CD 管道中的两个重要组成部分。理解它们之间的关系有助于更好地配置和使用 CI/CD 流水线。runer是gitlab的ci-agent对接gitlab,而执行器是接受runer下发的ci的任务来干活的。也就是说gitrunner…...

实用教程:如何无损修改MP4视频时长
如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域,有时我们需要深入到视频文件的底层结构中去。UltraEdit(UE)和UEStudio作为强大的文本编辑器,允许我们以十六进制模式打开和搜索MP4文件。本文将指导…...

mysqldump命令搭配source命令完成数据库迁移备份
mysqldump 命令使用 需保证mysqld在运行中, 这个命令的目的是将数据库导出到文件中,例如 mysqldump -uusername -ppassword database > db.sql 注意该命令不是在MySQL客户端(即MySQL命令行)执行的,而是在系统命…...

生信:TCGA学习(R、RStudio安装与下载、常用语法与常用快捷键)
前置环境 macOS系统,已安装homebrew且会相关命令。 近期在整理草稿区,所以放出该贴。 R语言、RStudio、R包安装 R语言安装 brew install rRStudio安装 官网地址:https://posit.co/download/rstudio-desktop/ R包下载 注意R语言环境自带…...

十三、注解配置SpringMVC
文章目录 1. 创建初始化类,代替web.xml2. 创建SpringConfig配置类,代替spring的配置文件3. 创建WebConfig配置类,代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类,代替web.xml 2. 创建SpringConfig配置类,代替spr…...

为什么海外服务器IP会被封
海外服务器因为免备案而备受用户欢迎,近年来租用海外服务器的用户也越来越多,自然也可能会出现一些问题。 如果服务器IP被封,在该服务器下的所有业务都无法访问,对自己和对用户来说都会有较大的影响。因此,我们应做好相…...

图像处理技术椒盐噪声
椒盐噪声,也称为脉冲噪声,是图像中经常见到的一种噪声。它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。这些白点和黑点会在图像中随机分布,导致图像中…...

[笔记]L6599的极限工作条件考量
0.名词 OTP over tempature protect.OCP over current protectOVP over voltage protectBrownout Protection Undervoltage Protection可能需要考虑hysteresis response.因为要考虑一些高频干扰 1.基本的过流保护逻辑 参考:ST L6599 器件手册 LLC开关电源&#…...

机器学习基础04
目录 1.朴素贝叶斯-分类 1.1贝叶斯分类理论 1.2条件概率 1.3全概率公式 1.4贝叶斯推断 1.5朴素贝叶斯推断 1.6拉普拉斯平滑系数 1.7API 2.决策树-分类 2.1决策树 2.2基于信息增益的决策树建立 2.2.1信息熵 2.2.2信息增益 2.2.3信息增益决策树建立步骤 2.3基于基…...

Ubuntu 20.04 配置开发环境(持续更新)
搜狗输入法不能显示中文 sudo apt install libqt5qml5 libgsettings-qt1 sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2 编译环境配置 sudo apt-get update #base tools of ubuntu sudo apt install net-tools gitk tree vim termina…...

Rocky9/Ubuntu使用pip安装python的库mysqlclient失败解决方式
# Rocky9 直接使用pip安装mysqlclient会出现缺少依赖,需要先安装mysql-devel相关依赖。由于rocky9用MariaDB替代了MySQL,所以我们可以通过安装mariadb-devel来安装所需要的依赖。 如果Rocky9已经开启了powertool repo可以直接使用下面命令安装 dnf in…...

探索 HTML 和 CSS 实现的 3D旋转相册
效果演示 这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果,每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画,实现了一个动态的旋转展示效果 HTML <div class"wrapper"><div class"inner" style"-…...

OpenJudge_ 简单英文题_04:0/1 Knapsack
题目 描述 Given the weights and values of N items, put a subset of items into a knapsack of capacity C to get the maximum total value in the knapsack. The total weight of items in the knapsack does not exceed C. 输入 First line: two positive integers N (…...

深入探索离散 Hopfield 神经网络
一、离散 Hopfield 神经网络的起源与发展 离散 Hopfield 神经网络由约翰・霍普菲尔德在 1982 年提出,这一创新性的成果在当时引起了广泛关注,成为早期人工神经网络的重要代表之一。 在那个时期,人工神经网络的发展还处于相对初级的阶段。霍…...

[智能车摄像头是一种安装在汽车上用于辅助驾驶和提高安全性的重要设备]
智能车摄像头是一种安装在汽车上用于辅助驾驶和提高安全性的重要设备。它们通常包括几个不同类型,如前视摄像头、环视摄像头、行车记录仪等。这些摄像头的主要功能有: 前视摄像头(Forward Camera):用于提供驾驶员前方…...

前端vue 列表中回显并下拉选择修改标签
1,vue数据列表中进行回显状态并可以在下拉框中选择修改,效果如下 2,vue 页面关键代码 <el-table-column label"审核" align"center" class-name"small-padding fixed-width" prop"status" >&…...

hbase未来的发展趋势
HBase 作为一个开源的分布式、可伸缩的 NoSQL 数据库,依托于 Hadoop 生态系统,以处理海量结构化数据为优势。随着大数据技术的发展,HBase 的发展趋势主要体现在以下几个方面: 1. 与云计算深度集成 随着企业向云迁移,HBase 也正在越来越多地部署在云环境中。云服务商(如 …...

Rust 语言学习笔记(二)
再继续快速学习一下 Rust 的以下几个知识点,就可以开始着手做点小工具了 基本数据类型复合数据类型基本的流程控制 Rust 设计为有效使用内存考虑的,它提供了非常细力度的数据类型,如整数分为有无符号,宽度从 8 位到 128 位&…...

【postman】怎么通过curl看请求报什么错
获取现成的curl方式: 1,拿别人给的curl 2,手机app界面通过charles抓包,点击接口复制curl 3,浏览器界面-开发者工具-选中接口复制curl 拿到curl之后打开postman,点击import,粘贴curl点击send&am…...

Python 编程入门指南(一)
1. Python 简介 Python是一种广泛使用的高级编程语言,因其简洁的语法和强大的功能而备受欢迎。Python由Guido van Rossum于20世纪90年代初设计,旨在提供易于阅读和编写的代码,适合从初学者到专业开发者的各个水平。它是一种解释型语言,这意味着在编写和执行代码之间不需要…...

macOS 设置固定IP
文章目录 以太网Wifi 基于 macOS 15.1 以太网 Wifi...

redis实现消息队列的几种方式
一、了解 众所周知,redis是我们日常开发过程中使用最多的非关系型数据库,也是消息中间件。实际上除了常用的rabbitmq、rocketmq、kafka消息队列(大家自己下去研究吧~模式都是通用的),我们也能使用redis实现消息队列。…...

debian 系统更新升级
系统升级能够有效避免漏洞导致的损害 不过需要做好提前和后续的测试,避免现有运行程序的错误。 debian安装参考:链接 一、清理过时和不再使用的源 1.清理源 vi /etc/apt/sources.list2.在下面的文件夹下清理不需要的 cd /etc/apt/sources.list.d二、…...

STM32学习笔记-----UART的概念
在 STM32 中,UART(Universal Asynchronous Receiver/Transmitter)是一种常用的串行通信接口,广泛应用于嵌入式系统中。STM32 提供了丰富的硬件资源来支持 UART 通信,可以通过标准库(STM32 HAL 或者标准外设…...

Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用
Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用 前言一、什么是 datatable 参数?Gherkin 表格示例 二、datatable 参数的基本使用feature文件:获取用户信息并执行相关操作的使用 datatable 处理表格数据Give…...

【408】SDN重点笔记
总特征:数据平面(负责转发)与控制平面(负责控制)分离 控制平面: 由服务器和软件组成。控制平面完成转发表,并分发。 路由器不再需要路由选择协议,不再交换信息,只负责收到…...

云运维基础
笔记内容侵权联系删除 云审计(CTS) 云审计云上资源变更均可被管控,实时系统性记录所有人的操作,无需手工统计。云审计服务支持将操作记录合并,周期性地生成事件文件实时同步转存到OBS存储桶,帮助用户实现…...

基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
摘 要 互联网发展至今,广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力…...

Rust开发一个命令行工具(一,简单版持续更新)
依赖的包 cargo add clap --features derive clap命令行参数解析 项目目录 代码 main.rs mod utils;use clap::Parser; use utils::{editor::open_in_vscode,fs_tools::{file_exists, get_file, is_dir, list_dir, read_file}, }; /// 在文件中搜索模式并显示包含它的行。…...