AndroidCompose Navigation导航精通2-过渡动画与路由切换

目录

    • 前言
    • 路由切换
      • NavController
      • BackStackEntry
    • 过渡动画
      • 过渡原理
      • 缩放动画
      • 渐隐动画
      • 滑动动画
    • 动画过渡实战

前言

在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更简洁、更高效的导航实现方式。本系列教程将深入探讨如何在 Android Compose 中实现各种导航功能,从基础的页面跳转到复杂的导航架构设计,帮助你全面掌握 Compose Navigation 的精髓。

在本系列的第二部分,此时将会学习三种不同的路由切换过渡动画,并了解如何正确高效的封装composable方法,实现路由的快速注册。


路由切换

NavController

NavController用于控制APP全局的路由导航,他也存在一种变体,下面是两个主要的controller对象

  1. NavController:Navigation导航的核心类,负责管理导航图(NavGraph)和返回栈(Back Stack),并提供导航操作的方法
  2. NavHostController:是 NavController 的一个子类,专门用于 Compose 环境。它继承了 NavController 的所有功能,并提供了一些额外的 Compose 特定的功能

除上述所述之外,您最好可以在使用过程中利用下方三个特点:

  1. 一般页面内基本都使用NavController对象
  2. 只有我们在定义NavHost时才会用到NavHostController对象
  3. 务必保证全局有且只有一个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)拥有以下几个特点:

  1. 后进先出(LIFO):
    返回栈采用后进先出的数据结构,即最后被访问的页面位于栈顶,最先被访问的页面位于栈底。
    当用户从一个页面导航到另一个页面时,新的页面会被推入栈顶。
    当用户点击返回按钮时,栈顶的页面会被弹出,用户返回到前一个页面。
  2. 初始目的地:
    当用户打开应用时,NavController 会将第一个目的地推送到返回栈的顶部。
  3. 导航操作:
    每次调用 NavController.navigate() 时,目标页面会被推入返回栈的顶部。
    调用 NavController.popBackStack() 时,会将当前页面从返回栈中弹出,并导航到前一个页面。
  4. 返回到特定目的地:
    你可以使用 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都有下面四个动画参数,通过给予不同的动画方法、提供适合的过渡延时,即可得到美观的路由切换过渡效果

  1. enterTransition:定义页面进入时的动画。
  2. exitTransition:定义页面退出时的动画。
  3. popEnterTransition:定义从栈中弹出页面时的进入动画。
  4. popExitTransition:定义从栈中弹出页面时的退出动画。

缩放动画

动画效果:

  1. 切换到新路由时:旧页面缩小后逐渐消失,新页面从小到大缩放后逐渐显现
  2. 回退到上一路由时:上述动画反过来

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文本左右对齐

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧! function fullJustify(words, maxWidth) {// 用于存储最终排版好的每一行文本const result [];// 用于遍历单词数组的索引,初始化为 0let i 0;…

Oracle 创建用户和表空间

Oracle 创建用户和表空间 使用sys 账户登录 建立临时表空间 --建立临时表空间 CREATE TEMPORARY TABLESPACE TEMP_POS --创建名为TEMP_POS的临时表空间 TEMPFILE /oracle/oradata/POS/TEMP_POS.DBF -- 临时文件 SIZE 50M -- 其初始大小为50M AUTOEXTEND ON -- 支持…

树状数组讲解

文章目录 1395.统计作战单位数 树状数组b站博主 灵神博主 tree数组:Tree[i] 存储的是原本的数组中num[i - (i&-i)1]到nums[i]的和 更新的时候,num[i[更新,逐一修改num[i(i & -i)] 307.区间和检索-数组可修改 题目实战 总的代码&#…

PostGIS笔记:PostgreSQL中表、键和索引的基础操作

创建、查看与删除表 在数据库中创建一个表,使用如下代码: create table streets (id serial not null primary key, name varchar(50));这里的表名是streets,id是主键所以非空,采用serial数据类型,这个数据类型会自动…

【JavaEE进阶】图书管理系统 - 壹

目录 🌲序言 🌴前端代码的引入 🎋约定前后端交互接口 🚩接口定义 🍃后端服务器代码实现 🚩登录接口 🚩图书列表接口 🎄前端代码实现 🚩登录页面 🚩…

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…

C++:多继承习题3

题目内容: 声明一个时间类Time,时间类中有3个私有数据成员(Hour,Minute,Second)和两个公有成员函数(SetTime和PrintTime)。要求: (1) SetTime根据传递的3个参数为对象设置时间; &a…

14-6-2C++STL的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…

Elasticsearch——Elasticsearch性能优化实战

摘要 本文主要介绍了 Elasticsearch 性能优化的实战方法&#xff0c;从硬件配置优化、索引优化设置、查询方面优化、数据结构优化以及集群架构设计等五个方面进行了详细阐述&#xff0c;旨在帮助读者提升 Elasticsearch 的性能表现。 1. 硬件配置优化 升级硬件设备配置一直都…

Linux进程调度与等待:背后的机制与实现

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 当一个进程发起某种操作&#xff08;如I/O请求、信号、锁的获取等&#xff09;&#xff0c;但该操作需要的资源暂时不可用时&#xff0c;进程会被操作系统挂起&#xff0c;进入“等待队列”或“阻塞状态”。…

【教学类-89-02】20250128新年篇02——姓名藏头对联(星火讯飞+Python,五言对联,有横批)

背景需求&#xff1a; 过年了&#xff0c;我想用幼儿的名字写对联&#xff0c;但是我根本不会写&#xff0c;于是尝试让AI来写。 1.我班的孩子的名字都是2字和3字的 2.惊喜发现&#xff0c;AI它很快就能生成带名字的对联 但是观察发现&#xff0c;如果是二个名字的对联&#…

Node.js基础

浏览器知识 浏览器 个浏览器都内置了DOM、BOM等API函数&#xff0c;供浏览器中的Javascript调用。 每个浏览器都有对应的JavaScript解析引擎。 浏览器中的JavaScript环境 V8引擎负责解析和执行JavaScript代码 内置API是由运行环境提供的特殊接口&#xff0c;只能在所属的运…

【漫话机器学习系列】066.贪心算法(Greedy Algorithms)

贪心算法&#xff08;Greedy Algorithms&#xff09; 贪心算法是一种逐步构建解决方案的算法&#xff0c;每一步都选择当前状态下最优的局部选项&#xff08;即“贪心选择”&#xff09;&#xff0c;以期望最终获得全局最优解。贪心算法常用于解决最优化问题。 核心思想 贪心选…

WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用

WPF基础 | WPF 常用控件实战&#xff1a;Button、TextBox 等的基础应用 一、前言二、Button 控件基础2.1 Button 的基本定义与显示2.2 按钮样式设置2.3 按钮大小与布局 三、Button 的交互功能3.1 点击事件处理3.2 鼠标悬停与离开效果3.3 按钮禁用与启用 四、TextBox 控件基础4.…

GD32的GD库开发

所有的Cortex-M处理器都有相同的SysTick定时器&#xff0c;因为CMSIS-Core头文件中定义了一个名为SysTick的结构体。 这个定时器可以用作延时函数&#xff0c;不管是STM32的芯片还是GD32&#xff0c;AT32的芯片&#xff0c;delay函数都可以这么写&#xff0c;只要它是cortex-M…

跨域问题及解决方案

跨域问题不仅影响开发效率&#xff0c;还可能导致项目进度延误。因此&#xff0c;理解和掌握跨域问题的原理及其解决方案对于前端开发者和后端开发者来说都至关重要。本文将详细介绍什么是跨域、跨域产生的原因&#xff0c;以及常见的后端跨域解决方案。 文章目录 一、什么是跨…

MoE的学习

1.MoE的介绍 混合专家模型&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;是一种先进的神经网络架构&#xff0c;旨在通过整合多个模型或“专家”的预测来提升整体模型性能。MoE模型的核心思想是将输入数据分配给不同的专家子模型&#xff0c;然后将所有子模型的输…

c++学习第十四天

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考。 //力扣代码 class Solution {const char* numStrArr[10]{"","","abc","def","ghi","jkl","mno","pqrs","tuv&q…

【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像

一、背景 由于国际镜像国内无法直接访问&#xff0c;会导致搜索模型时加载失败&#xff0c;如下&#xff1a; 因此需将国际地址替换为国内镜像地址。 二、操作 1、使用vscode打开下载路径 2、全局地址替换 关键字 huggingface.co 替换为 hf-mirror.com 注意&#xff1a;务…

循序渐进kubernetes-RBAC(Role-Based Access Control)

文章目录 概要Kubernetes API了解 Kubernetes 中的 RBACRoles and Role Bindings:ClusterRoles and ClusterRoleBindings检查访问权限&#xff1a;外部用户结论 概要 Kubernetes 是容器化应用的强大引擎&#xff0c;但仅仅关注部署和扩展远远不够&#xff0c;集群的安全同样至…