React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现
在移动应用中,动画效果 是提升用户体验的重要手段。合理的动画设计可以增强应用的交互性、流畅性和视觉吸引力。React Native 提供了多种实现动画的方式,包括内置的 Animated API、LayoutAnimation 以及第三方库(如 react-native-reanimated)。本章节将详细介绍如何使用这些工具来实现各种动画效果。
1.1 动画概述
在 React Native 中,动画主要用于以下场景:
- 组件的显示与隐藏: 例如,模态框的弹出与关闭。
- 界面元素的过渡: 例如,页面切换时的过渡动画。
- 交互反馈: 例如,按钮点击时的缩放效果。
- 数据驱动的动画: 例如,图表、进度条等动态变化。
React Native 提供了以下几种主要的动画实现方式:
AnimatedAPI: 强大的动画库,支持多种动画类型和插值。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…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
