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}}效果
企业数字化 ERP 产品动态
相关推荐
微信小程序+物联网打造无人羽毛球馆系统 1. 项目概述 作为一名长期从事体育场馆数字化改造的技术人员,最近完成了一个基于微信小程序的无人羽毛球馆系统开发项目。这个系统彻底改变了传统羽毛球馆的运营模式,实现了从场地预约到入场使用的全流程自助化服务。 传统羽毛球馆普遍存在几个痛点&… · 2026/11/6 11:51:35
2025服装电商ERP系统选型与技术架构解析 1. 服装电商ERP行业现状与核心痛点 服装行业作为电商领域最活跃的垂直赛道之一,其ERP系统选型直接影响着企业从生产到销售的全链路效率。2025年的市场数据显示,头部服装电商企业平均每天需要处理超过3000个SKU的进销存管理,这对ERP系统的实时… · 2026/11/6 11:51:35
AI快捷键进阶:五组组合键打通设计操作链 大多数人电脑里都存着一张AI(Adobe Illustrator)快捷键大全的截图,两三百个键位,看了几眼就再也没打开过。真正动手的时候,手还是慢:画一个等距排列的图标,一个个复制粘贴再对齐,二十… · 2026/11/6 11:51:35
大模型实操指南:从本地部署到PPT级可控生成 1. 这不是“学大模型”,而是重建你和信息世界的关系“大模型相关内容的研究学习”——看到这个标题,我第一反应是笑。不是嘲笑,是那种在实验室熬了三个通宵、刚调通一个LoRA微调任务后,盯着终端里跳出来的loss曲线突然失语的笑。因… · 2026/11/6 15:59:18
高效查找第K大元素:排序、堆与快速选择算法对比 1. 问题描述与核心挑战 给定整数数组 nums 和整数 k,我们需要找到数组中第 k 个最大的元素。请注意,这里要求的是排序后的第 k 个最大元素,而不是第 k 个不同的元素。 这个问题看似简单,但隐藏着几个关键挑战: 当数组… · 2026/11/6 15:05:13
企业设备数字化管理:易点易动系统实践指南 1. 设备管理在企业数字化转型中的核心价值 设备管理作为企业资产管理的重要组成部分,正在经历从传统人工记录向数字化、智能化管理的转变。在制造业、医疗、教育等行业,设备资产往往占据企业总资产的60%以上,其管理效率直接影响企业运营成本和… · 2026/11/6 15:05:13
企业元宇宙治理框架:技术实现与合规路径 1. 企业元宇宙治理框架的核心逻辑 企业元宇宙作为数字化转型的新阶段,其治理框架需要兼顾技术创新与合规要求。从技术架构角度看,企业元宇宙本质上是一个由数字孪生、区块链、人工智能等技术构成的复杂系统。这个系统需要解决三个核心问题:如… · 2026/11/6 14:59:51
基于CDC的MySQL实时数据同步方案实践 1. 项目背景与核心价值 在数据驱动的业务场景中,数据库表间数据同步是个高频需求。我最近在电商订单系统中就遇到了这个问题:订单主表数据变更后,需要实时同步到统计分析表和风控表。传统的手动同步或定时任务方式存在延迟高、易出错的问题&a… · 2026/11/6 14:00:34
JSP农贸交易系统开发与智能撮合算法实践 ## 1. 项目概述与核心价值农贸产品交易系统是连接农产品生产端与消费端的重要数字化桥梁。这个基于JSP技术的交易平台(项目编号g3608)完整包含了程序源码、数据库设计、部署指南和开发环境配置,是一套开箱即用的农产品B2B解决方案。我在参与某… · 2026/11/6 14:00:34
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* 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 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* 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 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* 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 10:29:23
三菱PLC数据采集到数据库的时序设计:Python+MC协议实战 /* 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:02:11
ASIC主模式RTL设计:状态机与三态驱动的流片级实现 /* 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:02:11
STM32嵌入式C++开发:GDB调试与Renode仿真实战指南 /* 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:02:11
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* 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 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* 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 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* 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 10:29:23