Compose UI 之 Small TopAppBar

Small 类型 TopAppBar

AppBar 主要由2类,顶部 AppBar底部 AppBar

  • 顶部 AppBar:主要包含了标题,action菜单,导航菜单。
  • 底部 AppBar:典型地包含主要导航项。

顶部 AppBar

顶部 AppBar 包含了 4 中类型: TopAppBar CenterAlignedTopAppBar MediumTopAppBar LargeTopAppBar

下面会逐个介绍 AppBar 的类型及给出示例。

TopAppBar

TopAppBar 是一个重要的组件,它提供了 Material Design 3 标准的顶部应用栏实现,提供现代化的外观和交互方式。TopAppBar 不仅具有直观且易用的 API,还支持高度定制,使得开发者能够轻松构建符合 Material Design 准则的应用界面。它通常包含应用的标题、导航图标、操作按钮等元素,为用户提供直观且一致的操作体验。

TopAppBar 特点

  • 高度可定制:开发者可以通过各种参数来定制 TopAppBar 的外观和行为,包括颜色、标题、导航图标、操作按钮等。
  • 响应式布局TopAppBar 支持不同的屏幕尺寸和方向,能够自动调整布局以适应不同的设备。
  • 易集成TopAppBar 与其他 Compose 组件和布局可以无缝集成,使得 UI 构建更加灵活和高效。

TopAppBar 声明及参数

下面是 TopAppBar 的声明。

@Composable
fun TopAppBar(title: @Composable () -> Unit,modifier: Modifier = Modifier,navigationIcon: @Composable () -> Unit = {},actions: @Composable RowScope.() -> Unit = {},windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,colors: TopAppBarColors = TopAppBarDefaults.topAppBarColors(),scrollBehavior: TopAppBarScrollBehavior? = null
): Unit

参数列表

参数名类型描述
title@Composable () -> Unit是应用栏的标题部分,通常显示页面相关的标题。它是一个标注 @Composable 的 lambda 表达式,你可以在其中放置任何你想要作为标题显示的 UI 元素,通常是一个 Text 组件。
modifierModifier用于更改或增强 TopAppBar 的行为。例如,你可以使用 Modifier.height() 来设置应用栏的高度。
navigationIcon@Composable () -> Unit是一个可选的导航图标,通常用于显示一个返回按钮或菜单图标。和 title 一样,这也是一个标注 @Composable 的 lambda 表达式。
actions@Composable RowScope.() -> Unit用于在应用栏的右侧放置操作按钮或图标。开发者可以在这里添加多个按钮,它们将水平排列(因为 RowScope 表示一个水平行布局的范围)。
windowInsetsWindowInsets定义了应用栏如何处理窗口插入,如状态栏、导航栏等。
colorsTopAppBarColors用于定义应用栏的颜色方案。TopAppBarColors 是一个包含多个颜色属性的对象,如背景色、标题色等。TopAppBarDefaults.topAppBarColors() 提供了默认的颜色设置。
scrollBehaviorTopAppBarScrollBehavior?当页面内容可以滚动时,scrollBehavior 定义了应用栏如何响应滚动事件。例如,应用栏可以在页面向下滚动时隐藏,并在页面向上滚动时重新显示。

下图是基本的 TopAppBar 效果图及说明。

TopAppBar

TopAppBar 示例

下面是一个具体的示例代码及运行结果图。

@Composable
fun MyTopAppBar() {TopAppBar(// 标题内容title = { Text("我的应用") },// 导航图标navigationIcon = {IconButton(onClick = { /* 处理导航图标点击事件 */ }) {Icon(Icons.Default.Menu, contentDescription = "导航菜单")}},// 动作图标actions = {// 添加动作按钮IconButton(onClick = { /* 处理动作1点击事件 */ }) {Icon(Icons.Default.Favorite, contentDescription = "收藏")}IconButton(onClick = { /* 处理动作2点击事件 */ }) {Icon(Icons.Default.Search, contentDescription = "搜索")}},// 各项颜色配置colors = TopAppBarDefaults.topAppBarColors(containerColor = ButterflyBlue,			// appbar 容器颜色actionIconContentColor = Purple40,		// 动作图标内颜色titleContentColor = Color.Magenta,		// 标题(参数 title 表示的 composable)颜色navigationIconContentColor = OrangeA700		// 导航图标内容颜色))
}

TopAppBar Sample

CenterAlignedTopAppBar

居中对齐顶部应用栏与 TopAppBar 基本一样,不同之处就在于它的标题默认居中放置。

CenterAlignedTopAppBar 的特点

  • 居中对齐的标题CenterAlignedTopAppBar的最大特点就是将标题文本居中放置在AppBar的中央,与传统的左对齐方式不同。这种设计可以让 AppBar 更加突出标题,特别是在标题较长或需要强调时。
  • 适应性强CenterAlignedTopAppBar能够根据不同的屏幕尺寸和方向自动调整其布局,确保UI在不同设备上的表现都是一致的。
  • 可定制性:开发者可以通过修改属性来定制CenterAlignedTopAppBar的外观和行为,例如修改标题文本、背景颜色、导航图标等。

CenterAlignedTopAppBar 声明及参数

CenterAlignedTopAppBar 的声明如下。

@Composable
fun CenterAlignedTopAppBar(title: @Composable () -> Unit,modifier: Modifier = Modifier,navigationIcon: @Composable () -> Unit = {},actions: @Composable RowScope.() -> Unit = {},windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(),scrollBehavior: TopAppBarScrollBehavior? = null
): Unit

可以发现,除了名称不同,参数的默认给出不同外,声明中的参数个数及参数名与 TopAppBar 一致。两者都属于 Small 类型的 AppBar。

因此此组件的参数说明表不再给出,直接参考 TopAppBar 的参数说明表格即可。

CenterAlignedTopAppBar 示例

因为 CenterAlignedTopAppBar 的定义包括界面 UI 与 TopAppBar 高度一致,因此下面从影响 AppBar 滚动的角度来给出示例。通过修改 scrollBehavior 的值与运行效果图查看 scrollBehavior 值产生的不同结果。

@Composable
fun CenterAlignedTopAppBarAndScrollBehaviorSample() {// 记住滚动状态,另外的 2 个方法:exitUntilCollapsedScrollBehavior(),pinnedScrollBehavior() 。val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()Scaffold(topBar = {CenterAlignedTopAppBar(modifier=Modifier.border(width = 1.dp, color= Color.Gray),title = { Text("AppBar 滚动行为 enterAlwaysScroll") },scrollBehavior = scrollBehavior,)},modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),) { innerPadding ->// 实际的滚动内容LazyColumn(contentPadding = innerPadding,modifier = Modifier.fillMaxSize(),) {items(100) { index ->ListItem(headlineContent = { Text("Item $index") },leadingContent = {Icon(imageVector = Icons.Default.Settings,contentDescription = "Localized description")})HorizontalDivider(thickness = 3.dp, color = Color.Red)}}}
}

enterAlwaysScroll

exitUntilCollapsedScroll

pinnedScroll

从上述 3 个运行结果图,总结出 scrollBehavior 的值导致运行后 AppBar 在内容滚动时的不同表现。

  • enterAlwaysScrollBehavior():当页面内容向下滚动时,TopAppBar 会随着滚动而逐渐出现或保持在屏幕顶部。当页面内容向上滚动时,TopAppBar 会逐渐滑出屏幕,但一旦开始向下滚动,它就会立即开始重新出现。
  • exitUntilCollapsedScrollBehavior():当页面内容向下滚动时,TopAppBar 会保持在屏幕顶部,直到一个特定的偏移量(通常是与 TopAppBar 高度相等的折叠距离)被达到,之后它会随着内容继续向下滚动而逐渐滑出屏幕。当内容向上滚动时,TopAppBar 会保持隐藏,直到内容滚动回到那个特定的偏移量,然后它会随着内容的滚动而逐渐滑入屏幕。
  • pinnedScrollBehavior():无论页面内容如何滚动,TopAppBar 都会固定在屏幕顶部,不会随着滚动而移动。

CenterAlignedTopAppBar与TopAppBar的对比

CenterAlignedTopAppBarTopAppBar都是Jetpack Compose中用于创建顶部应用栏的组件,但它们有一些异同点:

  1. 标题对齐方式TopAppBar的标题默认是左对齐的,而CenterAlignedTopAppBar则是将标题居中对齐。这是两者之间最显著的区别。
  2. 功能与使用:除了标题对齐方式不同外,两者在其他功能和使用上基本相似。它们都可以设置导航图标、操作项、背景颜色等,并且可以与其他Compose组件协同工作。
  3. 适用场景TopAppBar适用于大多数情况,特别是当标题较短或不需要特别强调时。而CenterAlignedTopAppBar则更适合在标题较长或需要突出标题时使用。

TopAppBar 是 Jetpack Compose Material3 库中一个重要的组件,它提供了实现 Material Design 3 顶部应用栏的便捷方式。通过合理使用 TopAppBar,开发者可以构建出符合 Material Design 准则、用户体验良好的 Android 应用界面。随着 Jetpack Compose 的不断发展和完善,TopAppBar 将在未来的 Android 应用开发中发挥更加重要的作用。

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

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

相关文章

webhook详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 webhook简介 在当今高度连接的网络世界中,没有什么可以孤立地发挥最佳作用。完成一项任务(几乎)总是需要多个实体的参与。电子商务应用程序需要与支付系统通信,支付…

Python快速入门系列-2(Python的安装与环境设置)

第二章:Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境(IDE)的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…

【操作系统学习笔记】文件管理2.2

【操作系统学习笔记】文件管理2.2 参考书籍: 王道考研 视频地址: Bilibili 文件系统的全局结构(布局) 外存结构 物理格式化,即低级格式化->划分扇区,检测坏扇区,并用备用扇区替换坏扇区逻辑格式化,即…

初级代码游戏的专栏介绍与文章目录

我的github: codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 一、大型专题 1.1 C嵌入式HTTP服务器 C嵌入式HTTP服务器_初级代码游戏的博…

关于 Rust 的 From 特性的尝试

文章目录 关于Rust的From特性的尝试 关于Rust的From特性的尝试 在The Rust Programming Language一书中,第 9.2 节Recoverable Errors with Result中有如下: For example, we could change the read_username_from_file function in Listing 9-7 to ret…

线性dp+中位数,POJ3666 Making the Grade

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 3666 -- Making the Grade (poj.org) 二、解题报告 1、思路分析 先不考虑…

【MySQL 系列】在 Ubuntu 上安装 MySQL

Ubuntu 是一个使用非常广泛的 Linux 发行版。Ubuntu Server 则是云上最流行的服务器操作系统。本篇文章中,我们展示了在 Ubuntu 上安装 MySQL 8 的详细步骤。 文章目录 1、先决条件2、在 Ubuntu 中安装 MySQL2.1、更新软件仓库包索引2.2、升级本地软件2.3、配置 MyS…

数据结构-二分查找

1.二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4 解…

Vessel - Linux hackthebox

#hard #runc #RE #Nodejs-SQLI Enumeration .git leak 使用 dumpall 下载 .git 打开 routes/index.js 可以看到网站使用 nodejs mysql 编写,且只有登录功能 router.post(/api/login, function(req, res) {let username req.body.username;let password req…

ROS2中launch编写及参数含义(xml、python)

ROS2系列文章目录 ROS2中nav_msgs/msg/Path 数据含义及使用 ROS2中std_msgs/msg/Header 数据含义及使用 ROS中TF变换详解 文章目录 ROS2系列文章目录ROS2中launch编写及参数含义(xml、python)一、ROS官方介绍二、实现案例1.编写主函数、CMakeLists.tx…

基于springboot实现图书推荐系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书馆推荐系统演示 摘要 时代的变化速度实在超出人类的所料,21世纪,计算机已经发展到各行各业,各个地区,它的载体媒介-计算机,大众称之为的电脑,是一种特高速的科学仪器,比…

实时智能应答3D数字人搭建

语音驱动口型的算法 先看效果: 你很快就可以帮得上我了 FACEGOOD 决定将语音驱动口型的算法技术正式开源,这是 AI 虚拟数字人的核心算法,技术开源后将大程度降低 AI 数字人的开发门槛。FACEGOOD是一家国际领先的3D基础软件开发商,…

VS2017 boost环境配置与报错解决

1、下载Boost 2、boost编译 将下载好的压缩包文件解压,我这里放到了D:\Qt文件夹内 按win键找到 vs2017(主要看你的vs是什么版本)的x86_x64兼容工具命令提示符 输入以下命令: 首先进入到解压的boost文件夹,复制一下前面解压的路径 cd D:\Qt\boost_1_78_0然后输入命令,…

Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)

1.简介 上一篇中已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先给大家介绍一下如何来创建一个测试计划(Test Plan)。 2.创建一个测试计划(Test Plan&#xff09…

Java设计模式深度解析:掌握工厂模式,优化对象创建与管理

工厂模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方法。在Java中,工厂模式可以通过接口和实现类来实现。比如我们建一个外形工厂,工厂提供对外的获取外形方法,传入不同的参数即可获取不同的外形。如图…

git命令行提交——github

1. 克隆仓库至本地 git clone 右键paste(github仓库地址) cd 仓库路径(进入到仓库内部准备提交文件等操作) 2. 查看main分支 git branch(列出本地仓库中的所有分支) 3. 创建新分支(可省…

Linux 之五:权限管理(文件权限和用户管理)

1. 文件权限 在Linux系统中,文件权限是一个非常基础且重要的安全机制。它决定了用户和用户组对文件或目录的访问控制级别。 每个文件或目录都有一个包含9个字符的权限模式,这些字符分为三组,每组三个字符,分别对应文件所有者的权限…

ETAS易特驰公司ESCRYPT信息

易特驰是全球领先的嵌入式软件开发与汽车信息安全解决方案和服务提供商。易特驰集团成立于1994年,是罗伯特博世集团的全资子公司。作为一家系统供应商,易特驰提供整套的工具和工具解决方案,同时也提供工程服务、咨询、培训和支持等服务。ESCR…

Rust:Mutex 的示例代码

在Rust中,你可以使用std::sync::Mutex来创建一个互斥锁,从而保护共享资源。下面是一个使用Mutex的简单示例: use std::sync::Mutex; use std::thread; use std::time::Duration; fn main() { // 创建一个包含整数的Mutex let counter…

[力扣 Hot100]Day47 从前序与中序遍历序列构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 出处 思路 根据先序和中序可以划分左右子树,递归构造子树即可。 代码 cla…