Compose UI 之 Small TopAppBar

news2025/9/21 1:04:29

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.coloradmin.cn/o/1503333.html

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

相关文章

FREERTOS DAY3

作业:1.总结任务的调度算法,把实现代码再写一下, FreeRTOS中默认的调度算法是 抢占式调度时间片轮转 1.抢占式调度:任务优先级高的可以打断任务优先级低的执行(适用于不同优先级) 2.时间片轮转&#xff…

低密度奇偶校验码LDPC(九)——QC-LDPC译码器FPGA全并行设计

往期博文 低密度奇偶校验码LDPC(一)——概述_什么是gallager构造-CSDN博客 低密度奇偶校验码LDPC(二)——LDPC编码方法-CSDN博客 低密度奇偶校验码LDPC(三)——QC-LDPC码概述-CSDN博客 低密度奇偶校验码…

day59 线程

创建线程的第二种方式 实现接口Runnable 重写run方法 创建线程的第三种方式 java.util.concurrent下的Callable重写call()方法 java.util.concurrent.FutureTask 创建线程类对象 获取返回值 线程的四种生命周期 线程的优先级1-10 default为5,优先级越高&#xff0c…

关于安科瑞ASD 开关柜综合测控装置的介绍-安科瑞 蒋静

1 概述 ASD 系列开关柜综合测控装置用于 3~35kV 户内开关柜,适用于中置柜、手车柜、固定柜、环 网柜等多种开关柜。具有一次回路模拟图及开关状态指示,高压带电显示及核相,自动温湿度控制,加热回路故障告警,分合闸…

弹性布局(下),过渡

弹性布局 1.当子元素在主轴方向的长度和大于父元素的情况 子元素在父元素中放不下是否换行? flex-warp: 默认值: nowrap 不换行,压缩子元素的长度,最常用 可选值: wrap 换行 当子元素被压缩时&#xff0…

Redux 与 Vuex:探索它们的设计思想及应用差异

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

微信加好友频繁会被封号吗?

微信加好友频繁会被封号吗? 微信规定,每个人每天最多可以加20个好友,但一天之内如果频繁加好友,微信可能会出现异常提示,需要暂停好友添加操作。 面对微信上突如其来的大量好友申请,一定要谨慎处理,以免被…

设计模式(十):抽象工厂模式(创建型模式)

Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对 象的接口,而无须指定它们的具体类。 之前写过简单工厂和工厂方法模式(创建型模式),这两种模式比较简单。 简单工厂模式其实不符合开闭原则,即对修改关闭…

PodMan容器技术

容器 容器技术 软件应用通常依赖于运行时环境提供的系统库、配置文件或服务。传统上,软件应用的运行时环境安装 在物理主机或虚拟机上运行的操作系统中。 然后,管理员在操作系统上安装应用依赖项。 在RHEL中,诸如 RPM 等打包系统可协助管…

Fastjson 1.2.24 反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

写在前面 CVE-2017-18349 指的是 fastjson 1.2.24 及之前版本存在的反序列化漏洞&#xff0c;fastjson 于 1.2.24 版本后增加了反序列化白名单&#xff1b; 而在 2019 年&#xff0c;fastjson 又被爆出在 fastjson< 1.2.47 的版本中&#xff0c;攻击者可以利用特殊构造的 …

【深度学习】知识点归纳总结-for 面试【自用】

add 和 concat的区别 特征add的时候就是增加特征的信息量&#xff0c;特征concat的时候就是增加特征的数量&#xff0c;注重细节的时候使用add&#xff0c;注重特征数量的时候使用concat&#xff0c; resnet用的add densenet用的concat RNN应用 一、关键字提取&#xff08;…

“比特币深夜冲破7万美元”!华尔街押注比特币:究竟是牛市墙头草,还是加密真信徒?

比特币ETF&#xff0c;使此次加密牛市与以往的繁荣、萧条周期截然不同。以往的周期往往由热衷风险的投机者以及最终崩盘的加密项目所驱动&#xff0c;例如无实物资产支持的加密货币借贷&#xff0c;以及一地鸡毛的ICO热潮。而现在&#xff0c;传统金融已经与加密世界联姻&#…

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE&#xff08;AiThinker_IDE&#xff09;编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK&#xff0c;将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…

Java - JVM

文章目录 一、JVM1. JVM的作用2. JVM、JRE、JDK的关系3. JVM的组成4. JVM工作流程5. 运行时方法区Runtime Data Area 二、深入JVM内存模型&#xff08;JMM&#xff09; 一、JVM 1. JVM的作用 Java代码编译成java字节码后&#xff0c;运行在JVM中&#xff0c;只要针对不同的系统…

鸿蒙Harmony应用开发—ArkTS声明式开发(触摸交互控制:触摸测试控制)

设置组件的触摸测试类型。ArkUI开发框架在处理触屏事件时&#xff0c;会在触屏事件触发前&#xff0c;进行按压点和组件区域的触摸测试来收集需要响应触屏事件的组件&#xff0c;然后基于触摸测试结果分发相应的触屏事件。hitTestBehavior属性可以设置不同的触摸测试响应模式&a…

20240308-1-校招前端面试常见问题CSS

校招前端面试常见问题【3】——CSS 1、盒模型 Q&#xff1a;请简述一下 CSS 盒模型&#xff1f; W3C 模式&#xff1a;盒子宽widthpaddingbordermargin 怪异模式&#xff1a;盒子宽widthmargin Q&#xff1a;inline、block、inline-block 元素的区别&#xff1f; inline&am…

0环PEB断链实现

截止到昨天那里我们的思路就清晰了&#xff0c;通过EPROCESS找到我们要隐藏的进程的ActiveProcessLinks&#xff0c;将双向链表的值修改&#xff0c;就可以将我们想要隐藏的这个进程的ActiveProcessLinks从双向链表中抹去的效果&#xff0c;这里的话如果在windbg里面直接使用ed…

[笔记]Crash Course Computer Science

文章目录 二进制算术逻辑单元 ALU算术单元逻辑单元 寄存器&内存CPU 中央处理器指令CPU结构运行命令时钟 高级CPU设计集成电路电子管晶体管集成电路印刷电路板 PCB Printed Circuit Board光刻摩尔定律 二进制 byte 在电脑中的单位换算&#xff1a; kilobyte 千字节 megaby…

【C++】手把手教你模拟实现 vector

目录 一、构造/析构/拷贝 1、构造函数 1️⃣无参的构造函数 2️⃣带参的构造函数 3️⃣类模板的构造函数 2、析构函数 3、拷贝构造 二、修改操作 1、reserve 【错误版本】 &#x1f31f;【解答】正确版本 2、resize 3、push_back 4、pop_back 5、insert 6、era…

【LV15 DAY7 阻塞和非阻塞】

一、五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉非阻塞&#xff1a;不能操作就返回错误 多路复用&#xff1a;委托中介监控信号驱动&#xff1a;让内核如果能操作时发信号&#xff0c;在信号处理函数中操作异步IO&#xff1a;向内核注册操作请求&#xff0c;内核…