AndroidCompose Navigation导航精通2-过渡动画与路由切换
目录
- 前言
- 路由切换
- NavController
- BackStackEntry
- 过渡动画
- 过渡原理
- 缩放动画
- 渐隐动画
- 滑动动画
- 动画过渡实战
前言
在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更简洁、更高效的导航实现方式。本系列教程将深入探讨如何在 Android Compose 中实现各种导航功能,从基础的页面跳转到复杂的导航架构设计,帮助你全面掌握 Compose Navigation 的精髓。
在本系列的第二部分,此时将会学习三种不同的路由切换过渡动画,并了解如何正确高效的封装composable方法,实现路由的快速注册。
路由切换
NavController
NavController用于控制APP全局的路由导航,他也存在一种变体,下面是两个主要的controller对象
- NavController:Navigation导航的核心类,负责管理导航图(NavGraph)和返回栈(Back Stack),并提供导航操作的方法
- NavHostController:是 NavController 的一个子类,专门用于 Compose 环境。它继承了 NavController 的所有功能,并提供了一些额外的 Compose 特定的功能
除上述所述之外,您最好可以在使用过程中利用下方三个特点:
- 一般页面内基本都使用NavController对象
- 只有我们在定义NavHost时才会用到NavHostController对象
- 务必保证全局有且只有一个NavController对象,也就是说他必须是单例的(所以我们一般都会从MainActivity就直接创建NavController,然后层层传递下去,就可以保证不会创建重复的对象)
如下代码即在定义NavHost时使用了NavHostController对象:
@Composable
fun NavGraphs(modifier: Modifier = Modifier,navController: NavHostController = rememberNavController(),startDestination: String = NavRoutes.INIT_NAV_ROUTE
) {NavHost(modifier = modifier, navController = navController, startDestination = startDestination) {...}
}
BackStackEntry
路由返回栈(BackStackEntry)拥有以下几个特点:
- 后进先出(LIFO):
返回栈采用后进先出的数据结构,即最后被访问的页面位于栈顶,最先被访问的页面位于栈底。
当用户从一个页面导航到另一个页面时,新的页面会被推入栈顶。
当用户点击返回按钮时,栈顶的页面会被弹出,用户返回到前一个页面。 - 初始目的地:
当用户打开应用时,NavController 会将第一个目的地推送到返回栈的顶部。 - 导航操作:
每次调用 NavController.navigate() 时,目标页面会被推入返回栈的顶部。
调用 NavController.popBackStack() 时,会将当前页面从返回栈中弹出,并导航到前一个页面。 - 返回到特定目的地:
你可以使用 popBackStack() 方法导航到特定的目的地,并可以选择是否将该目的地从返回栈中弹出。
例如,navController.popBackStack(R.id.destinationId, true) 会导航到指定的目的地,并将其从返回栈中弹出。
你可以先拿到一个NavController对象,再根据它来得到当前的路由返回栈;
获取方式如下所示:
val navController = rememberNavController()
val currentBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = currentBackStackEntry?.destination
过渡动画
过渡原理
修改导航过渡动画主要依赖于 AnimatedNavHost 和 composable 函数中的 enterTransition、exitTransition、popEnterTransition 和 popExitTransition 参数。这些参数允许你自定义页面跳转时的动画效果;
每一个composable都有下面四个动画参数,通过给予不同的动画方法、提供适合的过渡延时,即可得到美观的路由切换过渡效果
- enterTransition:定义页面进入时的动画。
- exitTransition:定义页面退出时的动画。
- popEnterTransition:定义从栈中弹出页面时的进入动画。
- popExitTransition:定义从栈中弹出页面时的退出动画。
缩放动画
动画效果:
- 切换到新路由时:旧页面缩小后逐渐消失,新页面从小到大缩放后逐渐显现
- 回退到上一路由时:上述动画反过来
相关文章:
AndroidCompose Navigation导航精通2-过渡动画与路由切换
目录 前言路由切换NavControllerBackStackEntry过渡动画过渡原理缩放动画渐隐动画滑动动画动画过渡实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更…...
基于微信小程序的社团活动助手php+论文源码调试讲解
4 系统设计 微信小程序社团微信小程序的设计方案比如功能框架的设计,比如数据库的设计的好坏也就决定了该系统在开发层面是否高效,以及在系统维护层面是否容易维护和升级,因为在系统实现阶段是需要考虑用户的所有需求,要是在设计…...
WebSocket 详解:全双工通信的实现与应用
目录 一、什么是 WebSocket?(简介) 二、为什么需要 WebSocket? 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket…...
漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)
文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…...
智慧园区系统分类及其在提升企业管理效率中的创新应用探讨
内容概要 智慧园区的概念已经逐渐深入人心,成为现代城市发展中不可或缺的一部分。随着信息技术的飞速发展和数字化转型的不断推进,一系列智慧园区管理系统应运而生。这些系统不仅帮助企业提高了管理效率,还在多个方面激发了创新。 首先&…...
29. 【.NET 8 实战--孢子记账--从单体到微服务】--项目发布
这是本专栏最后一篇文章了,在这片文章里我们不重点讲解如何配置服务器,重点讲如何发布服务,我们开始吧。 一、服务器配置 服务器配置包含:服务器的选择和项目运行环境的配置,下面我们分别来讲解一下。 在服务器选择上…...
Langchain+讯飞星火大模型Spark Max调用
1、安装langchain #安装langchain环境 pip install langchain0.3.3 openai -i https://mirrors.aliyun.com/pypi/simple #灵积模型服务 pip install dashscope -i https://mirrors.aliyun.com/pypi/simple #安装第三方集成,就是各种大语言模型 pip install langchain-comm…...
TensorFlow实现逻辑回归模型
逻辑回归是一种经典的分类算法,广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型,并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先,我们准备两类数据点,分别表示两个不同…...
C++进阶课程第2期——排列与组合1
大家好,我是清墨,欢迎收看《C进阶课程——排列与组合》。 啊,上一期我们的情况啊也是非常好的,今天直接开始! 排列(Arrange) 与上期一样啊,我们先了解一下排列的概念。 排列是指将…...
C++17 std::variant 详解:概念、用法和实现细节
文章目录 简介基本概念定义和使用std::variant与传统联合体union的区别 多类型值存储示例初始化修改判断variant中对应类型是否有值获取std::variant中的值获取当前使用的type在variant声明中的索引 访问std::variant中的值使用std::get使用std::get_if 错误处理和访问未初始化…...
Leetcode::119. 杨辉三角 II
119. 杨辉三角 II 已解答 简单 相关标签 相关企业 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0…...
多模态论文笔记——TECO
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文TECO(Temporally Consistent Transformer),即时间一致变换器,是一种用于视频生成的创新模型&…...
Ubuntu 16.04用APT安装MySQL
个人博客地址:Ubuntu 16.04用APT安装MySQL | 一张假钞的真实世界 安装MySQL 用以下命令安装MySQL: sudo apt-get install mysql-server 这个命令会安装MySQL服务器、客户端和公共文件。安装过程会出现两个要求输入的对话框: 输入MySQL root用户的密…...
Linux 4.19内核中的内存管理:x86_64架构下的实现与源码解析
在现代操作系统中,内存管理是核心功能之一,它直接影响系统的性能、稳定性和多任务处理能力。Linux 内核在 x86_64 架构下,通过复杂的机制实现了高效的内存管理,涵盖了虚拟内存、分页机制、内存分配、内存映射、内存保护、缓存管理等多个方面。本文将深入探讨这些机制,并结…...
JavaScript逆向高阶指南:突破基础,掌握核心逆向技术
JavaScript逆向高阶指南:突破基础,掌握核心逆向技术 JavaScript逆向工程是Web开发者和安全分析师的核心竞争力。无论是解析混淆代码、分析压缩脚本,还是逆向Web应用架构,掌握高阶逆向技术都将助您深入理解复杂JavaScript逻辑。本…...
嵌入式知识点总结 Linux驱动 (四)-中断-软硬中断-上下半部-中断响应
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.硬中断,软中断是什么?有什么区别? 2.中断为什么要区分上半部和下半部? 3.中断下半部一般如何实现? 4.linux中断的…...
在ubuntu下一键安装 Open WebUI
该脚本用于自动化安装 Open WebUI,并支持以下功能: 可选跳过 Ollama 安装:通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录:如果安装目录 (~/open-webui) 已存在,脚本会自动删除旧目录并重新安装。完整的依…...
c语言网 1127 尼科彻斯定理
原题 题目描述 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 #include<ios…...
Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析
第一部分:问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…...
吴恩达深度学习——如何实现神经网络
来自吴恩达深度学习,仅为本人学习所用。 文章目录 神经网络的表示计算神经网络的输出激活函数tanh选择激活函数为什么需要非激活函数双层神经网络的梯度下降法 随机初始化 神经网络的表示 对于简单的Logistic回归,使用如下的计算图。 如果是多个神经元…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
