【Android】Componse中的常用组件

发布时间:2026/11/6 12:25:54

【Android】Componse中的常用组件 Componse中的常用组件一. 常用组件1.1 HorizontalPager 轮播图1.2 Scaffold 脚手架1.2.1 基础Scaffold1.2.2 添加顶部导航栏1.2.3 添加底部导航栏1.2.4 添加悬浮按钮1.2.5 封装BottomNav1.3. SecondaryScrollableTabRow 分类Tab1.3.1. 最简单的分类Tab1.3.2. 自定义选中样式1.4. 底层弹窗ModelBottomSheet1.4.1. 简单集成一. 常用组件1.1 HorizontalPager 轮播图ComposablefunBasicPagerDemo(){// 由于没有图片 使用颜色代替valcolorslistOf(Color(0xFFE91E63),// 粉色Color(0xFF2196F3),// 蓝色Color(0xFF4CAF50)// 绿色)// 定义pageState对象valpageStaterememberPagerState(pageCount{colors.size})HorizontalPager(statepageState,verticalAlignmentAlignment.Top){page-// 当前页数下标Box(modifierModifier.fillMaxWidth().aspectRatio(2.6f).background(colors[page]),contentAlignmentAlignment.Center){Text(第${page1}页,fontWeightFontWeight.Bold,colorColor.White)}}}rememberPagerState(pageCount { colors.size }): 创建分页状态 3页HorizontalPager 水平分页组件类似ViewPageraspectRatio: 宽高比**{page -} ** 每一页的UI, page是当前页面 0,1,2rememberPagerState参数说明pageCount { 数量 } - 总页数Lambda形式initalPage 起始页 - 初始显示第几页默认0pageState提供了几个关键属性让我们可以随时获取分页的状态pageState提供了两个挂起函数1.2 Scaffold 脚手架什么是ScaffoldScaffold是Componse提供的”页面框架模版“就像盖房子先搭脚手架一样它帮你自动处理顶部栏、底部栏、内容区域的位置关系不用手动计算问题。1.2.1 基础ScaffoldComposablefunScaffoldStepOne(){Scaffold{paddingValues-Box(modifierModifier.fillMaxSize().padding(paddingValues).background(Color.Red),contentAlignmentAlignment.Center// 内容居中显示){Text(主题内容-简单的脚手架,fontSize20.sp)}}}结果运行之后你可以看到屏幕居中显示”主内容“不会被状态栏遮挡解释Scaffold { paddingValues - ...}: 大括号中是内容区域paddingValues Scaffold自动计算出安全距离你不用管具体数值用它就行。f1.2.2 添加顶部导航栏// 使用Scaffold(topBar{TopAppBarView()}// 导航栏)// 导航栏OptIn(ExperimentalMaterial3Api::class)ComposablefunTopAppBarView(){TopAppBar(title{Text(导航栏标题,fontWeightFontWeight.Bold,fontSize20.sp)},colorsTopAppBarDefaults.topAppBarColors(containerColorColor.Blue,// 导航栏的背景色titleContentColorColor.Green// 导航栏标题颜色))}结果topBar参数接受一个Componse组件TopAppBar是Material3提供的标准顶部栏自带标题模式colors参数设置顶部栏背景色和标题颜色加上后paddingvalues会自动包含顶部导航栏的高度OptIn(ExperimentalMaterial3Api::class)TopAppBar的部分参数是实验性API需要加这个注解。它只是一个标记告诉编译器”我知道这是实验性的“。1.2.3 添加底部导航栏首先我们可以配置下icons库implementation(androidx.compose.material:material-icons-extended:1.7.8)Scaffold(// ... 其他配置bottomBar{BottomBarView()}// 底部导航栏){// ... 内容}ComposablefunBottomBarView(){NavigationBar{NavigationBarItem(selectedtrue,icon{Icon(Icons.Filled.Home,contentDescription首页)},label{Text(首页)},onClick{})NavigationBarItem(selectedtrue,icon{Icon(Icons.Filled.AlarmOn,contentDescription消息)},label{Text(首页)},onClick{})NavigationBarItem(selectedtrue,icon{Icon(Icons.Filled.Person,contentDescription我的)},label{Text(首页)},onClick{})}}结果1.2.4 添加悬浮按钮Scaffold(// ... 其他配置floatingActionButton{// 悬浮按钮FloatingActionButton(onClick{/* 处理点击事件 */}){Icon(Icons.Filled.Add,contentDescription添加)}}){// 内容 ....}结果1.2.5 封装BottomNav实现底部工具栏的点击ComposablefunScaffoldStepOne(){// 定义底部table数据valtabslistOfTabItem(TabItem(首页,selectedIconIcons.Filled.Home,unSelectedIconIcons.Outlined.Home,TabType.Home),TabItem(消息,selectedIconIcons.Filled.AlarmOn,unSelectedIconIcons.Outlined.AlarmOn,TabType.Message),TabItem(我的,selectedIconIcons.Filled.Person,unSelectedIconIcons.Outlined.Person,TabType.Mine),)// 声明变量记录当前的选中tab类型varcurrentRoutebyremember{mutableStateOf(TabType.Home)}Scaffold(// 其他属性内容 ...bottomBar{BottomBarView(tabs,currentRoute,{currentRouteit})},// 底部导航栏){// 内容....}// 封装的底部工具栏代码ComposablefunBottomBarView(tabs:ListTabItem,currentRoute:TabType,onTableItemClick:(TabType)-Unit){NavigationBar{tabs.forEach{tab-NavigationBarItem(selectedcurrentRoutetab.route,icon{Icon(if(currentRoutetab.route)tab.selectedIconelsetab.unSelectedIcon,contentDescriptiontab.name)},label{Text(tab.name)},onClick{onTableItemClick(tab.route)})}}}注意ImageVector是矢量图标的类型Icons.Filled.Home是实心图标选中时用Icons.Outlined.Home是描边图标未选中时用1.3. SecondaryScrollableTabRow 分类Tab例如顶部的分类标签1.3.1. 最简单的分类TabOptIn(ExperimentalMaterial3Api::class)ComposablefunCategoryTabsDemo(){valcategorieslistOfString(全部,Android,Java,Kotlin,网络,算法,数据库)varselectedIndexbyremember{mutableIntStateOf(0)}SecondaryScrollableTabRow(selectedTabIndexselectedIndex,edgePadding16.dp){categories.forEachIndexed{index,category-Tab(selectedselectedIndexindex,text{Text(category)},onClick{selectedIndexindex})}}}1.3.2. 自定义选中样式OptIn(ExperimentalMaterial3Api::class)ComposablefunCategoryTabsCustomDemo(){valcategorieslistOfString(全部,Android,Java,Kotlin,网络,算法,数据库)varselectedIndexbyremember{mutableIntStateOf(0)}SecondaryScrollableTabRow(selectedTabIndexselectedIndex,edgePadding16.dp,indicator{},// 取出默认的指示器就是选中的item下面的下划线divider{}){categories.forEachIndexed{index,category-Tab(selectedselectedIndexindex,text{Column(horizontalAlignmentAlignment.CenterHorizontally,modifierModifier.background(Color.Red)){// 文字Text(category,fontSize15.sp,colorif(selectedIndexindex)Color.BlackelseColor.Gray,fontWeightif(selectedIndexindex)FontWeight.BoldelseFontWeight.Normal)// 选中时的下划线if(selectedIndexindex){Spacer(modifierModifier.height(5.dp))Box(modifierModifier.width(20.dp).height(2.dp).background(Color.Black))}}},onClick{selectedIndexindex})}}}结果:1.4. 底层弹窗ModelBottomSheetModelBottomSheet是Mateial3的实验性API使用时需要加注解OptIn(ExperimentalMaterial3Api::class)。OptIn不是功能代码只是一个标记实验性API可能在未来的版本变化编译器要求你明确知道风险。1.4.1. 简单集成OptIn(ExperimentalMaterial3Api::class)ComposablefunFilterSheetDemo(onDismiss:()-Unit){ModalBottomSheet(onDismissRequestonDismiss){Text(这个是弹窗内容,modifierModifier.padding(20.dp))}}// 调用// 声明底部视图的类型。varshowModelBottomViewbyremember{mutableStateOf(false)}// 点击事件触发floatingActionButton{// 悬浮按钮FloatingActionButton(onClick{/* 处理点击事件 */showModelBottomViewtrue}){Icon(Icons.Filled.Add,contentDescription添加)}}// 显示弹窗// 底部弹窗if(showModelBottomView){FilterSheetDemo{showModelBottomViewfalse}}效果
延伸阅读

更多相关文章

2026/11/6 11:55:49

2025服装电商ERP系统选型与技术架构解析

1. 服装电商ERP行业现状与核心痛点 服装行业作为电商领域最活跃的垂直赛道之一,其ERP系统选型直接影响着企业从生产到销售的全链路效率。2025年的市场数据显示,头部服装电商企业平均每天需要处理超过3000个SKU的进销存管理,这对ERP系统的实时…

2026/11/6 11:55:49

AI快捷键进阶:五组组合键打通设计操作链

大多数人电脑里都存着一张AI(Adobe Illustrator)快捷键大全的截图,两三百个键位,看了几眼就再也没打开过。真正动手的时候,手还是慢:画一个等距排列的图标,一个个复制粘贴再对齐,二十…

2026/11/6 11:50:48

Redis主从同步机制解析与优化实践

1. Redis主从同步的本质与挑战Redis主从同步远非简单的数据拷贝过程,而是一个精心设计的分布式系统状态同步机制。在实际生产环境中,我们常常会遇到这样的场景:一个承载着每秒数万次读写请求的Redis主节点,如何在保持服务不中断的…

2026/11/6 13:01:06

Qt飞机大战源码拆解:从工程结构到二次开发实战

简介:这份资源是面向Qt初学者与游戏开发入门者的「飞机大战」完整项目源码包,围绕Qt框架的图形渲染、事件驱动与资源管理等核心能力展开,可用于课程设计、练手项目或Qt技术学习参考。压缩包共223个文件,约6.21MB,以105…

2026/11/6 13:01:06

JSP农贸交易系统开发与优化实践

1. 项目概述 这个JSP农贸产品交易系统是一个典型的B2B电子商务平台,专为农产品流通领域设计。我在2018年曾参与过类似项目的全流程开发,深知这类系统对农产品供需匹配的关键作用。系统采用经典的JSPServlet技术栈,配合MySQL数据库&#xff0c…

2026/11/6 12:56:05

电商抽奖系统订单流程设计与优化实践

1. 抽奖活动订单流程设计概述抽奖活动作为电商平台常见的营销手段,其订单流程设计直接关系到用户体验和系统稳定性。一个完善的抽奖订单系统需要解决三个核心问题:库存管理、参与次数控制和数据一致性。传统设计往往将这些功能耦合在单一表中&#xff0c…

2026/11/6 12:56:05

企业数字化转型中的设备管理系统实践与价值

1. 设备管理在企业数字化转型中的核心价值 现代企业的设备资产管理正面临前所未有的挑战。随着数字化转型浪潮席卷各行各业,传统的设备管理方式已经无法满足企业高效运营的需求。以制造业为例,一家中型工厂通常拥有上千台设备资产,从生产设备…

2026/11/6 12:51:05

AIGC落地实战:从重复工作流中识别高价值切口

1. 这不是概念炒作,而是正在发生的生产力迁移 “AIGC:一个值得探索的新蓝海?”——这个标题里藏着两个关键信号:一个是“ AIGC ”,它早已不是实验室里的名词,而是每天在设计师的图层面板里生成草稿、在运…

2026/11/6 12:51:05

CSP-J初赛选择题训练2021:分块刷题与错题复盘

很多人第一次认真做CSPJ初赛选择题训练2021的时候,都会经历一个很别扭的阶段:十套卷子刷完,正确率纹丝不动,错的地方还是那几处——补码的边界、二叉树的叶子数、快排的最坏情况、代码段里循环变量到底跑了几轮。对完答案&#xf…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/6 10:49:01

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:03:39

MCU晶振电路设计全解析:从负载电容计算到PCB布局调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/6 10:49:01

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑