【Android】Compose 布局基础

发布时间:2026/10/28 9:28:52

【Android】Compose 布局基础 一. 构建基础布局什么是界面UI?应用的界面 (UI) 就是您在屏幕上所看到的内容文本、图片、按钮和许多其他类型的元素及其在屏幕上的布局方式。它既是应用向用户显示内容的方式也是用户与应用展开互动的载体1.1. Jetpack Compose介绍什么是Jetpack ComposeJetpack Compose 是用于构建 Android 界面的新款工具包。Compose 使用更少的代码、强大的工具和直观的 Kotlin 功能可以帮助您简化并加快 Android 界面开发。借助 Compose您可以通过定义一组函数来构建界面这些函数称为可组合函数它们会接受数据并描述界面元素。1.1.1. 可组合函数在 Compose 中可组合函数是界面的基本构建块。可组合函数描述界面中的某一部分。不会返回任何内容。接受一些输入并生成屏幕上显示的内容。ComposablefunGreeting(name:String){Text(textHello$name!)}可组合函数带有Composable注解。所有可组合函数都必须带有此注解。此注解可告知Compose编译器此函数用于将数据转换为界面。请注意编译器是一种特殊的程序它会接受您编写的代码逐行查看然后将其转换成计算机可以理解的指令机器语言。关于可组合函数的几点说明Jetpack Compose 是围绕可组合函数构建的。这些函数可让您以程序化方式定义应用的界面只需描述应用界面的外观而不必关注界面的构建过程。如需创建可组合函数只需将 Composable 注解添加到函数名称中即可可组合函数可以接受一些实参用来让应用逻辑描述或修改界面。在本例中界面元素接受一个 String以便在问候用户时称呼姓名。1.1.2. 注释注解是用于在代码中附加额外信息的方式。此类信息可以帮助 Jetpack Compose 编译器等工具和其他开发者理解应用的代码。若要应用注解只需在您要注解的声明开头为其名称注解添加字符作为前缀即可。您可以为包括属性、函数和类在内的不同代码元素添加注解。下图是一个带有注解的函数示例以下代码段中包含一些带有注解的属性示例。在后续开发中您将用到这些属性。// Example code, do not copy it overJsonvalimgSrcUrl:StringVolatileprivatevarINSTANCE:AppDatabase?null1.1.3. 带形参/不带形参的注解注解可以接受形参。形参可以为处理它们的工具提供额外信息。以下是带形参和不带形参的 Preview 注解的一些示例不带形参的注解带形参的注解带有预览标题的注解您可以向注解传递多个实参如下所示## 1.2. 更改字体大小可缩放像素可缩放像素 (SP)是字体大小的度量单位。Android 应用中的界面元素使用两种不同的度量单位一种是您稍后将为布局使用的密度无关像素 (DP)另一种就是可缩放像素 (SP)。默认情况下SP 单位与 DP 单位大小相同但前者的大小会根据用户在手机设置下的首选文本大小进行调整。在MainActivity.kt文件中滚动到GreetingText()函数中的Text()可组合项。向Text()函数传递fontSize实参作为第二个具名实参并将其值设为100.sp。ComposablefunGreetingText(message:String,modifier:ModifierModifier){// 设置字体大小和行高Text(message,fontSize100.sp,lineHeight116.sp)}效果我们还可以再添加一个文本ComposablefunGreetingText(message:String,from:String,modifier:ModifierModifier){Text(from,fontSize36.sp)Text(message,fontSize100.sp,lineHeight116.sp)}Preview(showBackgroundtrue)ComposablefunBirthdayCardPreview(){GreetingText(messageHappy Birthday Sam!,From Emma)}一个可组合函数可能会描述多个界面元素。不过如果您未提供有关如何排列这些元素的指导Compose 可能会以您不喜欢的方式排列它们。例如上面的代码生成了两个相互重叠的文本元素因为您没有提供有关如何排列这两个可组合项的指导。1.3. 文本的排列方式行/列界面层次结构基于包含机制意即一个组件可以包含一个或多个组件有时会用“父级”和“子级”这两个词来表述。这种说法是指父界面元素包含子界面元素而子界面元素还可以继续包含子界面元素。在此部分中您将了解可用作父界面元素的Column、Row 和 Box 可组合项。Compose中的3 个基本标准布局元素是Column、Row 和 Box可组合项。后面会介绍BoxColumn、Row 和 Box 都是接受可组合内容作为参数的可组合函数因此您可以在这些布局元素内放置项目。例如Row 可组合项中的各个子元素彼此相邻地水平放置成一行。ComposablefunGreetingText(message:String,from:String,modifier:ModifierModifier){Row{Text(from,fontSize36.sp)Text(message,fontSize36.sp,lineHeight36.sp)}}将内容排成一列ComposablefunGreetingText(message:String,from:String,modifier:ModifierModifier){Column{Text(from,fontSize36.sp)Text(message,fontSize36.sp,lineHeight36.sp)}}1.4. 尾随lambda语法请注意在上一个代码段中Row 可组合函数中使用的是花括号而不是圆括号。这称为尾随 Lambda 语法。稍后会详细介绍 lambda 和尾随 lambda 语法。现在您只需要熟悉这个常用的 Compose 语法。当最后一个形参是函数时Kotlin 提供了一种特殊语法来将函数作为形参传递给函数将函数作为形参传递时您可以使用尾随 lambda 语法。您可以将函数放在圆括号外部的大括号中而不是放在圆括号内。这是 Compose 中的一种常见且推荐的做法因此您需要熟悉代码的格式。例如Row() 可组合函数中的最后一个形参是 content 形参它是一个描述子界面元素的函数。假设您想要创建一个包含三个文本元素的行。以下代码行得通但如果为尾随 lambda 使用具名形参则非常麻烦Row(content{Text(Some text)Text(Some more text)Text(Last text)})由于 content 形参是函数签名中的最后一个形参并且您要将其值作为 lambda 表达式传递因此您可以移除 content 形参和括号如下所示Row{Text(Some text)Text(Some more text)Text(Last text)}1.5 将内容居中如需在屏幕中心对齐问候语请添加一个名为verticalArrangement的形参并将其设置为Arrangement.Center。ComposablefunGreetingText(message:String,from:String,modifier:ModifierModifier){Column(verticalArrangementArrangement.Center,modifiermodifier){Text(from,fontSize36.sp,modifierModifier.padding(16.dp)// Compose 提供 align 修饰符来单独控制子级可组合项的位置使其不受父布局强制执行的对齐布局规则的约束。这里是单独制定该text的排列方式.align(alignmentAlignment.End))Text(message,fontSize36.sp,lineHeight36.sp,textAlignTextAlign.Center)}}1.6. 添加图片若要在应用中显示图片需要有一个显示位置。就像使用 Text 可组合项显示文本一样可以使用 Image 可组合项来显示图片。通过添加可组合函数来添加图片在MainActivity.kt文件中在GreetingText()函数后面添加一个GreetingImage()可组合函数。向GreetingImage()函数传递两个String形参一个名为 message用于添加生日祝福语另一个名为 from用于添加签名。每个可组合函数都应接受一个可选的Modifier形参。修饰符用于控制界面元素在其父布局中的放置、显示或行为方式。在 GreetingImage() 可组合函数中添加另一个形参。ComposablefunGreetingImage(message:String,from:String,modifier:ModifierModifier){}1.6.1 Jetpack Compose中的资源资源是指代码使用的附加文件和静态内容例如位图、界面字符串、动画说明等。您应该始终将应用资源如图片和字符串与代码分隔开以便能够独立地维护这些资源。在运行时Android 会根据当前配置使用合适的资源。例如您可能想根据屏幕尺寸提供不同的界面布局或根据语言设置提供不同的字符串资源分组您应始终将每种类型的资源放在项目的res/目录下的相应子目录中。例如以下是一个简单项目的文件层次结构MyProject/src/MyActivity.kt res/drawable/graphic.png mipmap/icon.png values/strings.xml在此示例中res/目录中包含存储在不同子目录中的所有资源其中包括存储图片资源的 drawable/ 目录、存储启动器图标的 mipmap/目录和存储字符串资源的 values/目录。访问资源Jetpack Compose 可以访问您的Android 项目中定义的资源。可以使用在项目的R 类中生成的资源 ID 访问资源。R 类是Android自动生成的类其中包含了项目中所有资源的 ID。在大多数情况下资源 ID 与文件名相同。例如可以使用以下代码访问上面的文件层次结构中的图片R.drawable.graphic1.6.2 显示图片在GreetingImage()函数中声明val属性并将其命名为image。通过传入androidtest资源来调用painterResource()函数。将返回值分配给image变量。valimagepainterResource(R.drawable.androidtest)// painterResource() 函数会加载可绘制图片资源并将资源 ID在本例中为 R.drawable.androidparty作为实参调用painterResource()函数后添加Image可组合函数然后传入image作为painter的具名实参。ComposablefunGreetingImage(message:String,from:String,modifier:ModifierModifier){valimagepainterResource(R.drawable.androidtest)Image(painterimage)}报错如下解决方案Image(painterimage,// 将图片的 contentDescription 实参设为 null以便 TalkBack 跳过 Image 可组合函数。contentDescriptionnull// 无障碍描述)1.7. 添加盒子布局BoxBox 布局是 Compose 中的标准布局元素之一。使用 Box 布局可将元素堆叠在一起。Box 布局还可用于配置它所包含的元素的特定对齐方式。在GreetingImage()函数中添加围绕 Image 可组合项的 Box 可组合项如下所示然后 在GreetingImage函数中调用GreetingText函数ComposablefunGreetingImage(message:String,from:String,modifier:ModifierModifier){valimagepainterResource(R.drawable.androidtest)Box(modifier){Image(painterimage,contentDescriptionnull)GreetingText(message,from,Modifier.fillMaxSize().padding(8.dp))}}1.8. 调整图片大小Image(painterimage,contentDescriptionnull,// 设置图片的缩放方式contentScaleContentScale.Crop,// 使图片充满Box父盒子modifierModifier.fillMaxSize(),// 设置图片的透明度alpha0.5f)最终效果1.9 Spacer - 间距ComposablefunSpacerDemo(){Column(modifierModifier.padding(16.dp)){Text(标题,fontSize20.sp,fontWeightFontWeight.Bold)// 增加间距组件Spacer(modifierModifier.height(8.dp))// 标题和内容之间相距8.dpText(这是文字内容,fontSize14.sp,colorColor.Gray)}}Spacer: 是手动在两个元素之间插入间距更灵活spacedBy:spacedBy(8.dp)是在Column/Row参数中设置自动给所有子元素加间距。2.0 weight - 按比例分配ComposablefunWeightDemo(){Column(modifierModifier.fillMaxWidth().background(Color.Green)){Row(modifierModifier.fillMaxWidth().height(40.dp)){Box(modifierModifier.weight(1f).fillMaxSize().background(Color.Red))Box(modifierModifier.weight(1f).fillMaxSize().background(Color.Green))Box(modifierModifier.weight(1f).fillMaxSize().background(Color.Blue))}}}
延伸阅读

更多相关文章

2026/10/28 9:28:52

vector的使用和模拟

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

2026/10/28 9:28:52

List迭代器和模拟(迭代器的模拟)

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

2026/10/28 9:23:49

虚拟世界法律框架:智能合约与数字治理实践

1. 项目背景与核心价值"数字创世纪:在虚拟世界重写人类法典"这个项目名称本身就蕴含着深刻的时代命题。当元宇宙、数字孪生等技术从概念走向落地,我们突然发现:虚拟世界正在形成一套独立于现实社会的运行规则。去年某知名虚拟平台爆…

2026/10/28 10:29:22

从光子计数到场景感知:单光子激光雷达技术发展现状与趋势

从光子计数到场景感知:单光子激光雷达技术发展现状与趋势 摘要:单光子激光雷达以光子级探测灵敏度突破了传统线性激光雷达在作用距离与弱回波条件下的性能边界,正在从实验室走向遥感测绘、智能驾驶与消费电子的规模化应用。当前该领域的技术演进呈现出两条相互交织的主线:…

2026/10/28 10:29:22

SpringBoot 结合Mybatis

新建项目后创建目录之后编写mapper类对应代码主方法的类中添加注释编写新增的方法确认返回结构Controller层代码编写启动后postman测试接口功能GetMapping("/{id}")GetMapping("list")PostMappingPutMappingDeleteMapping("/{id}")getAllUserSor…

2026/10/28 10:29:22

《人不知而不愠:一场关于“关山”与“为己之学”的独立探索》

《人不知而不愠:一场关于“关山”与“为己之学”的独立探索》撰写这篇长篇学术评论的缘起,始于重读李晨阳教授的《与时俱进的人类原则——提倡一种研究儒学的新进路》。李先生在文中提出,儒学要与时俱进,只需把孟子的“核心立场”…

2026/10/28 10:29:22

物业费太贵怎么办?别死磕降价,这两条合规省钱路更实在

每次在业主群里看到有人问“物业费太贵怎么办”,底下总是一水儿的“成立业委会换物业”或“拒交抗议”。但现实很骨感。中指研究院今年10月发布的数据摆在那:2026年全国物业服务满意度均值掉到了72.8分,住宅物业费收缴率也一直在82.67%左右徘…

2026/10/28 10:24:17

命令模式思想与 EvSim 事件调度

命令模式把一次操作请求封装成对象,使请求能够被保存、传递、排队,并在合适的时候执行。本文结合 EvSim 的事件机制,说明事件如何表达动作,以及事件队列和世界对象如何共同完成调度。在程序中,执行一个动作最直接的方式…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

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

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

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