Compose UI 之 MediumLarge TopAppBar

news2024/12/30 3:37:39

Medium&Large TopAppBar

前面文章介绍了 Small 类型的 TopAppBarTopAppBar CenterAlignedTopAppBar 。下来介绍 Medium 和 Large 类型的 TopAppBarMediumTopAppBar LargeTopAppBar

MediumTopAppBar

上面介绍了Small 类型的 TopAppBar (TopAppBar CenterAlignedTopAppBar),这里再介绍一个 MediumTopAppBar

MediumTopAppBar的特点

  • 适中的高度MediumTopAppBar 相较于传统的 TopAppBar 拥有适中的高度,这既保证了足够的空间来展示应用标题、图标和其他关键信息,又避免了因过高而占用过多屏幕空间的问题。

  • 灵活的布局MediumTopAppBar 支持自定义布局,开发者可以根据需求添加导航图标、标题、操作项等元素,并调整它们的位置和样式。

  • 响应式设计MediumTopAppBar 能够根据设备的屏幕尺寸和方向自动调整其布局和大小,确保在不同设备上都能呈现出良好的视觉效果。

使用场景分析

MediumTopAppBar 适用于那些需要展示更多信息或进行复杂操作的应用场景。例如,在新闻阅读应用中,可以使用 MediumTopAppBar 来展示新闻标题、搜索栏和分类按钮,以便用户能够更方便地浏览和筛选内容。

动画效果

MediumTopAppBar 支持多种动画效果,这些效果可以极大地提升用户体验。例如,当用户滚动页面时,MediumTopAppBar 可以逐渐隐藏或显示,这种滚动动画效果可以使得界面更加流畅和自然。此外,MediumTopAppBar 还可以与页面的其他元素进行联动,实现更复杂的动画效果。

MediumTopAppBar 声明及参数

MediumTopAppBar 的声明如下。

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

对于 MediumTopAppBar 的参数说明如下表。

参数名类型描述
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.mediumTopAppBarColors() 提供了默认的颜色设置。
scrollBehaviorTopAppBarScrollBehavior?当页面内容可以滚动时,scrollBehavior 定义了应用栏如何响应滚动事件。例如,应用栏可以在页面向下滚动时隐藏,并在页面向上滚动时重新显示。

MediumTopAppBar 的样式及使用示例

MediumTopAppBar 运行后显示的样式,标题在其他的图标下面。

MediumTopAppBar

示例及运行动态效果如下。

@Composable
fun ComponentDemoMain() {
    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            MediumTopAppBar(
                title = {
                    Text(
                        "MediumTopAppBar 标题",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },

                navigationIcon = {
                    IconButton(onClick = {}) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = ""
                        )
                    }
                },
                actions = {
                    IconButton(onClick = {}) {
                        Icon(
                            imageVector = Icons.Filled.Edit,
                            contentDescription = ""
                        )
                    }
                },
                scrollBehavior = scrollBehavior,
            )
        },
        content = { innerPadding ->
            LazyColumn(
                modifier = Modifier.background(color = Color.LightGray),
                contentPadding = innerPadding,
                verticalArrangement = Arrangement.spacedBy(8.dp)
            ) {
                val list = (0..75).map { it.toString() }
                items(count = list.size) {
                    Text(
                        text = "列表 item ${list[it]}",
                        style = MaterialTheme.typography.bodyLarge,
                        modifier = Modifier
                            .fillMaxWidth()
                            .background(color = Color.White)
                            .padding(horizontal = 16.dp, vertical = 10.dp),
                        fontSize = 18.sp
                    )
                }
            }
        }
    )
}

gif_MediumTopAppBar

从运行的图上可以看出,MediumTopAppBar 与主界面内 LazyColumn 有个联动的效果。这与 TopAppBar CenterAlignedTopAppBar 有明显区别。

MediumTopAppBarTopAppBar CenterAlignedTopAppBar 的区别

  1. 高度与外观
    • TopAppBar 通常具有标准的高度,适合简洁快速的UI交互。
    • CenterAlignedTopAppBar 的特点是标题居中,适合需要突出标题的场景。
    • MediumTopAppBar 则在高度上介于两者之间,提供了更多的空间来展示内容,同时保持了优雅的外观。
  2. 使用场景
    • TopAppBar 适用于大部分常规应用,特别是那些不需要额外空间来展示额外信息的场景。
    • CenterAlignedTopAppBar 更适合在标题内容重要且需要强调的场景中使用。
    • MediumTopAppBar 则适用于需要更多空间来放置图标、文本或其他操作项的场景,特别是那些强调内容展示和交互的应用。
  3. 动画效果
    • 所有这三种 TopAppBar 变体都支持动画效果,但具体实现和效果可能会因组件的特性和使用场景的不同而有所差异。

LargeTopAppBar

LargeTopAppBar 是 Android Compose 库中的一个重要组件,它主要用于在应用的顶部展示一个较大的应用栏(App Bar)。它通常包含应用的标题、导航图标以及其他可能的操作项,如搜索、设置等。

LargeTopAppBar 的 UI 设计特点:

  1. 尺寸较大:与普通的 TopAppBar 相比,LargeTopAppBar 在高度上更加突出,能够容纳更多的内容和更复杂的布局。这使得它在展示信息丰富的标题、副标题或图标时更加得心应手。
  2. 灵活性高:LargeTopAppBar 支持多种自定义选项,如设置标题的字体、颜色、对齐方式等,还可以添加自定义的操作项。这种灵活性使得开发者能够根据应用的整体风格和页面需求来定制独特的顶部应用栏。
  3. 适配性强:LargeTopAppBar 能够很好地适应不同的屏幕尺寸和布局需求。无论是在手机、平板还是折叠屏幕上,它都能提供一致的用户体验。
  4. 交互友好:LargeTopAppBar 的设计考虑了用户的交互习惯,提供了直观的导航和操作方式。例如,用户可以通过点击导航图标返回上一页面,或者通过点击操作项来执行特定的功能。

LargeTopAppBar 在功能上:

  1. 显示标题和副标题:LargeTopAppBar 可以显示应用的标题和副标题,帮助用户快速了解当前页面的主要内容。
  2. 导航图标:组件内置了导航图标的功能,通常用于实现返回上一页面或回到主页面的操作。
  3. 操作项支持:LargeTopAppBar 允许添加多个操作项,如搜索按钮、设置按钮等。这些操作项可以根据实际需求进行定制和布局。
  4. 滚动行为定制:当页面内容滚动时,LargeTopAppBar 可以表现出不同的行为。例如,它可以随着内容的滚动而逐渐隐藏或显示,从而提供更多的阅读空间。
  5. 主题和样式定制:开发者可以通过 Compose 的主题和样式系统来定制 LargeTopAppBar 的外观,以确保它与应用的其他部分保持视觉上的一致性。

LargeTopAppBar 可以放置标题、导航图标和动作如下图。

LargeTopAppBar

下面从 LargeTopAppBar 声明,示例及运行效果查看它的表现。

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

参数表

参数名类型描述
title@Composable () -> Unit用于指定应用栏的标题内容。它接收一个 Composable 函数,这意味着你可以在其中定义任意的 Compose UI 元素作为标题。这个函数不返回任何值(返回类型是 Unit),它的作用仅仅是描述 UI。
modifierModifier参数用于应用各种修改器到 LargeTopAppBar 上。这些修改器可以改变组件的布局、外观、行为等。默认情况下,这个参数是 Modifier,即没有应用任何修改器。
navigationIcon@Composable () -> Unit用于设置应用栏的导航图标。它也接收一个返回类型为 Unit 的 Composable 函数,允许你自定义导航图标的外观。默认情况下,这个参数是空的,即没有导航图标。
actions@Composable RowScope.() -> Unit参数允许你在应用栏中添加一组动作,通常是一些按钮或图标。这个参数接收一个在 RowScope 中定义的 Composable 函数,这意味着你可以在这个函数中使用 Row 相关的 API。默认情况下,这个参数是空的,即没有添加任何动作。
windowInsetsWindowInsets参数用于指定窗口内边距信息,比如状态栏的高度等。这些信息可以帮助 LargeTopAppBar 正确地适应屏幕的边缘。默认情况下,这个参数使用 TopAppBarDefaults.windowInsets,这是系统定义的默认值。
colorsTopAppBarColors参数用于设置应用栏的颜色。它接收一个 TopAppBarColors 对象,其中包含各种颜色的定义。默认情况下,这个参数使用 TopAppBarDefaults.largeTopAppBarColors(),即 Material Design 规范中的默认颜色设置。
scrollBehaviorTopAppBarScrollBehavior?参数用于指定当内容滚动时应用栏的行为。例如,它可以控制应用栏是否随着内容滚动而隐藏或显示。这个参数的类型是 TopAppBarScrollBehavior?,它是一个可选参数,默认情况下是 null,表示没有指定滚动行为。

示例代码:

@Composable
fun LargeTopAppBarSample() {
    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            LargeTopAppBar(
                title = {
                    Text(
                        text = "LargeTopAppBar 标题",
                        maxLines = 2,
                        overflow = TextOverflow.Ellipsis,
                    )
                },

                navigationIcon = {
                    IconButton(onClick = {}) {
                        Icon(
                            imageVector = Icons.Filled.Home,
                            contentDescription = ""
                        )
                    }
                },
                actions = {
                    IconButton(onClick = {}) {
                        Icon(
                            imageVector = Icons.Filled.Settings,
                            contentDescription = ""
                        )
                    }
                },
                scrollBehavior = scrollBehavior,
            )
        },
        content = { innerPadding ->
            LazyColumn(
                modifier = Modifier.background(color = Color.LightGray),
                contentPadding = innerPadding,
                verticalArrangement = Arrangement.spacedBy(8.dp)
            ) {
                val list = (0..75).map { it.toString() }
                items(count = list.size) {
                    Text(
                        text = "列表 item ${list[it]}",
                        style = MaterialTheme.typography.bodyLarge,
                        modifier = Modifier
                            .fillMaxWidth()
                            .background(color = Color.White)
                            .padding(horizontal = 16.dp, vertical = 10.dp),
                        fontSize = 18.sp
                    )
                }
            }

        }
    )
}

运行上述示例代码后的效果如下图,开始的 title 显示在 TopAppBar 的其他图标下方,当随着内容滚动后,标题逐步显示到与图标同一行。

LargeTopAppBar-title

如果标题内容很长,超过一行所能显示的内容宽度时,可以通过设置 title 参数内的组件参数,显示不同的两行效果。

将标题内容设置为 “LargeTopAppBar 是一个在 Jetpack Compose 中定义的 Composable 函数,用于创建一个尺寸较大的顶部应用栏,适用于 Material Design 风格的 Android 应用。”,这个内容超出一行可显示的范围。不同的 title 组件设置参数会产生不同的效果。

  1. 设置标题行数及超出部分的显示样式。

    Text(
        text = "LargeTopAppBar 是一个在 Jetpack Compose 中定义的 Composable 函数,用于创建一个尺寸较大的顶部应用栏,适用于 Material Design 风格的 Android 应用。",
        maxLines = 2,
        overflow = TextOverflow.Ellipsis,
    )
    

    title 组件改为上述组件后运行,显示效果如下图。 可见 LargeTopAppBar 显示标题内容的行数正常显示的是 2 行。

    LargeTopAppBar-twolines-title

  2. 不设置参数,将普通的 title 组件设置显示。

    Text(
        text = "LargeTopAppBar 是一个在 Jetpack Compose 中定义的 Composable 函数,用于创建一个尺寸较大的顶部应用栏,适用于 Material Design 风格的 Android 应用。",
    )
    

    上述 title 设置后的运行结果,及滚动页面内容后的结果如下图。
    LargeTopAppBar-twoline-title-common


LargeTopAppBar-twoline-title-common_2

上述两个图中可以看出,当 title 内容超出 2 行可显示的最多内容时,组件的内容会超出到屏幕之外,当内容向上滑动后,从右图中可以看出,显示的内容刚好是左图内容的前面 2 行。因此 LargeTopAppBartitle 最多显示 2 行内容,且当内容显示超出 2 行可以显示的最多内容时,title 表示组件内容会扩展到屏幕外。

MediumTopAppBar 和 LargeTopAppBar 的区别

功能特点:

  1. MediumTopAppBar

    • 提供了一个中等高度的应用栏设计

    • 适中的高度,使其既不会过于显眼也不会过于拥挤。

    • 适用于大多数标准应用场景,提供基本的导航和动作功能。

  2. LargeTopAppBar

    • 提供一个较大的应用栏设计,允许更多的内容和元素放置其中。

    • 提供更大的空间,可以容纳更多的内容和交互元素。

    • 适用于需要强调品牌、搜索或其他核心功能的应用场景。

    • 可能包含更复杂的交互和动画效果。

性能表现:

从性能的角度看,MediumTopAppBarLargeTopAppBar 两者之间的主要差异在于渲染复杂性和布局计算。由于 LargeTopAppBar 可能包含更多的元素和更复杂的布局,因此它可能需要更多的处理时间来测量、布局和绘制。然而现代的硬件发展很快,两者之间的这种差别几乎可以忽略不计。

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

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

相关文章

数字人ai直播软件突破AI大模型技术,改变未来科技格局!

数字人AI直播软件在AI大模型技术上的突破,将不可避免地改变未来科技格局。这一突破让人们看到了AI技术的无限可能性,并为未来的科技发展打开了新的大门。 AI大模型技术是近年来人工智能领域的一个热点,它通过构建庞大、复杂的神经网络模型&a…

海外互联网专线主要解决企业哪些办公问题?

海外互联网专线 是一种专门为跨境企业提供的网络连接服务,旨在解决企业在海外办公过程中遇到的各种网络问题。海外互联网专线如何成为解决企业办公难题的利器,为企业提供稳定、高速的网络连接? 1、跨国远程办公: 随着全球化进程的加速&…

SpringCloud Ribbon 负载均衡服务调用

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第三篇,即介绍 Ribbon 负载均衡服务调用 二、概述 2.1 Ribbon 是什么 Spring Cloud Ribbon…

【博士每天一篇文献-综述】Modular Brain Networks

阅读时间:2023-11-27 1 介绍 年份:2016 作者:Olaf Sporns,Richard Betzel,印第安纳大学心理与脑科学杰出教授 期刊: Annual review of psychology 引用量:1205 详细介绍了模块化大脑网络及其如…

在【IntelliJ IDEA】中配置【Tomcat】【2023版】【中文】【图文详解】

作为一款功能强大的集成开发环境(IDE),IntelliJ IDEA为Web服务器提供了卓越的支持,从而极大地简化了程序员在Web开发过程中的工作流程。学习Java Web开发实质上就是掌握如何创造动态Web资源,这些资源在完成开发后&…

宠物空气净化器值得入手吗?选购宠物空气净化器关注哪些方面?

一开始养猫时,每天看着可爱的猫咪在家里快乐奔跑,让人心情愉悦。然而,作为铲屎官都知道,猫咪会掉毛,特别是在换毛期间,地板、沙发上都会有一大堆猫毛,甚至衣服也可能沾满猫毛。养猫家庭中&#…

Flink 物理执行图

文章目录 物理执行图一、Task二、ResultPartition三、ResultSubpartition四、InputGate五、InputChannel 物理执行图 JobManager根据ExecutionGraph对作业进行调度,并在各个TaskManager上部署任务。这些任务在TaskManager上的实际执行过程就形成了物理执行图。物理…

快速上手:使用Hexo搭建并自定义个人博客

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

算法---双指针练习-6(查找总价格为目标值的两个商品)

查找总价格为目标值的两个商品 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址:点这里 2. 讲解算法原理 算法的基本思想是首先初始化两个指针begin和end,分别指向数组的起始位置和末尾位置。 接下来,算法使用一个循环来移动e…

瑞芯微 | I2S-音频基础分享

1. 音频常用术语 名称含义ADC(Analog to Digit Conversion)模拟信号转换为数字信号AEC(Acoustic Echo Cancellor)回声消除AGC(Automatic Gain Control)自动增益补偿,调整MIC收音量ALSA&#xf…

Stable Diffusion 3报告

报告链接:https://stability.ai/news/stable-diffusion-3-research-paper 文章目录 要点表现架构细节通过重新加权改善整流流量Scaling Rectified Flow Transformer Models灵活的文本编码器RF相关论文 要点 发布研究论文,深入探讨Stable Diffuison 3的…

HarmonyOS 数据持久化 关系型数据库之 初始化操作

上文 HarmonyOS 数据持久化之首选项 preferences 我们有说用户首选项 但它只能处理一些比较简单的数据类型结构 的持久化处理 如果是一些批量较大 结构较为复杂的数据结构 那么 首选项就无法满足了 我们就要选择 关系型数据库 通过 SQLite 组件实现的一种本地数据库&#xff0…

IPSEC VPPN实验

实验背景:FW1和FW2是双机热备的状态。 实验要求:在FW和FW3之间建立一条IPSEC通道,保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 IPSEC VPPN实验配置(由于是双机热备状态,所以FW1和FW2只需要配置FW1主设备即可&…

企业专属采购商城搭建,对接电商平台数量越多越好吗?

近年来在国家政策驱动和国央企的引领示范下,企业采购逐渐从线下向电商化迈进,采购电商平台的应用让越来越多的传统企业、中小企业开始意识到数字化商城采购的价值。搭建企业自有专属采购商城,内接企业各类信息管理系统,外联电商采…

spring-cloud-openfeign 3.0.0(对应spring boot 2.4.x之前版本)之前版本feign整合ribbon请求流程

在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 下图为自己整理的

阿里云k8s内OSS报错UnKnownHost。

这个问题就是链接不上oss属于网络问题: 1.排查服务器 在服务器(ecs)上直接ping oss地址看是否能够通。 不通就要修改dns和hosts(这个不说,自己网上查) 2.排查容器 进去ping一下你的容器是否能访问到oss…

07.axios封装实例

一.简易axios封装-获取省份列表 1. 需求:基于 Promise 和 XHR 封装 myAxios 函数,获取省份列表展示到页面 2. 核心语法: function myAxios(config) {return new Promise((resolve, reject) > {// XHR 请求// 调用成功/失败的处理程序}) …

生活的色彩--爱摸鱼的美工(17)

题记 生活不如意事十之八九, 恶人成佛只需放下屠刀,善人想要成佛却要经理九九八十一难。而且历经磨难成佛的几率也很小,因为名额有限。 天地不仁以万物为刍狗! 小美工记录生活,记录绘画演变过程的一天。 厨房 食…

BUUCTF---[MRCTF2020]你传你呢1

1.题目描述 2.打开题目链接 3.上传shell.jpg文件&#xff0c;显示连接成功&#xff0c;但是用蚁剑连接却连接不上。shell文件内容为 <script languagephp>eval($_REQUEST[cmd]);</script>4.用bp抓包&#xff0c;修改属性 5.需要上传一个.htaccess的文件来把jpg后缀…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Marquee)

跑马灯组件&#xff0c;用于滚动展示一段单行文本。仅当文本内容宽度超过跑马灯组件宽度时滚动&#xff0c;不超过时不滚动。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Ma…