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.mzph.cn/pingmian/68413.shtml

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

相关文章

分库分表后如何进行join操作

在分库分表后的系统中,进行表之间的 JOIN 操作比在单一数据库表中复杂得多,因为涉及的数据可能位于不同的物理节点或分片中。此时,传统的 SQL JOIN 语句不能直接用于不同分片的数据,以下是几种处理这样的跨分片 JOIN 操作的方法&a…

【深度学习】线性回归的简洁实现

线性回归的简洁实现 在过去的几年里,出于对深度学习强烈的兴趣,许多公司、学者和业余爱好者开发了各种成熟的开源框架。 这些框架可以自动化基于梯度的学习算法中重复性的工作。 目前,我们只会运用: (1)通…

C++中的显式构造和隐式构造

文章目录 一、概述二、显式构造函数的使用三、隐式构造函数的使用四、显式和隐式的适用场景 一、概述 在 C 中,构造函数可以分为 显式构造 和 隐式构造,它们的区别主要体现在构造函数的调用方式上。 1.显式构造(Explicit Constructor&#…

【YOLOv11改进- 主干网络】YOLOv11+MobileNetV3(2019): 更快,更精准;

YOLOV11目标检测-主干网络改进实例与创新改进专栏 目录 YOLOV11目标检测-主干网络改进实例与创新改进专栏 本文介绍 1.完整代码获取 2.MobileNetv3介绍 文章摘要 3. MobileNetv3网络结构图 4. yolov11-MobileNetv3 yaml文件 5.MobileNetv3代码实现 6.MobileNetv3添加方…

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…

浅谈文献阅读(reference)对留学论文写作的重要性

很多留学生在写作留学论文时,拿到题目后就急于求成立马动笔写作。可是写着写着就会陷入非常迷惘的境地,不知道如何继续。当然这其中有很多原因,但其中最重要的一条,就是在写作英语论文之前,没有进行足够的知识积累&…

es6中关于let的使用以及案例,包括但不限于块级作用域,不允许重复声明,没有变量提升,暂存性死区,不与顶层对象挂钩

ES6 let 关键字完整指南 1. 块级作用域 1.1 let vs var 作用域对比 // var - 函数作用域 function varExample() {var x 1;if (true) {var x 2; // 同一个 xconsole.log(x); // 2}console.log(x); // 2 }// let - 块级作用域 function letExample() {let x 1;if (true…

提升企业内部协作的在线知识库架构与实施策略

内容概要 在当前快速变化的商业环境中,企业对于提升内部协作效率的需求愈显迫切。在线知识库作为信息存储与共享的平台,成为了推动企业数字化转型的重要工具。本文将深入探讨如何有效打造与实施在线知识库,强调架构设计、知识资产分类管理及…

网络工程师 (3)指令系统基础

一、寻址方式 (一)指令寻址 顺序寻址:通过程序计数器(PC)加1,自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址:通过转移类指令直接或间接给出下一条指令的地址。跳…

度小满Java开发面试题及参考答案 (上)

String 是基本类型吗?String、StringBuffer、StringBuilder 的区别是什么?拼接字符串有哪些做法? String 不是基本类型,它是 Java 中的一个类,属于引用类型。 下面来看看 String、StringBuffer、StringBuilder 的区别: 类型可变性线程安全性性能适用场景String不可变线程…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现,详见下文: 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现,其形参均采用了…

vue项目中,如何获取某一部分的宽高

vue项目中,如何获取某一部分的宽高 在Vue项目中,如果你想要获取某个DOM元素的宽度和高度,可以使用原生的JavaScript方法或者结合Vue的特性来实现。以下是几种常见的方法: 使用ref属性 你可以给需要测量宽高的元素添加一个ref属…

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…

Linux初识——基本指令(2)

本文将继续从上篇末尾讲起,讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move(移动)的缩写,其功能为:1.剪切文件、目录。2.重命名 先演示下重命名,假设我想把当前目录下的di34改成dir5 那…

函数与方法

具名函数 具名函数是有名称的函数,可以在定义之前或之后调用。 特点 有函数名。定义后可以多次调用。便于调试,因为在调用栈中可以看到函数名。 function add(a, b) {return a b; }console.log(add(2, 3)); // 输出: 5 匿名函数 匿名函数没有名称…

定制Centos镜像(一)

环境准备: 一台最小化安装的干净的系统,这里使用Centos7.9,一个Centos镜像,镜像也使用Centos7.9的。 [rootlocalhost ~]# cat /etc/system-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# rpm -qa | wc -l 306 [rootloca…

Android - 通过Logcat Manager简单获取Android手机的Log

由于工作需要,经常需要获取Android手机的Log。 平常都是通过adb命令来获取,每次都要写命令。 偶然的一个机会,我从外网发现了一个工具 Logcat Manager,只需要通过简单的双击即可获取Android的Log,这里也分享一下。 目…

c++学习第十三天

创作过程中难免有不足,若您发现本文内容有误,恳请不吝赐教。 提示:以下是本篇文章正文内容,下面案例可供参考 一、vector 1.介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空…

「数学::质数」分解质因子 / LeetCode 2521(C++)

概述 由算数基本定理,我们知道任意一个大于1的自然数可以表示为一些质数的乘积: LeetCode 2521: 给你一个正整数数组 nums ,对 nums 所有元素求积之后,找出并返回乘积中 不同质因数 的数目。 注意: 质数 是…

docker-compose Zookeeper 集群搭建

文章目录 前言docker-compose Zookeeper 集群搭建1. Zookeeper下载2. 制作Dockerfile文件3. 构建镜像4. docker-compose 管理5. docker-compose构建/启动6. 验证6.1 docker ps6.2 使用 zkCli.sh 连接并验证集群 前言 如果您觉得有用的话,记得给博主点个赞&#xff0…