当前位置: 首页 > news >正文

Compose 中的 Modifiers 使用

本章将介绍 Compose 修饰符(Modifiers),并讲解如何使用它们自定义可组合函数的外观和行为。涵盖的内容包括:修饰符概述、Modifier 对象简介、修饰符的创建与使用方法,以及如何为自定义可组合函数添加修饰符支持。

修饰符概述

许多可组合函数会接收一个或多个参数,用于定义它们在应用运行时的外观和行为。例如,我们可以通过传递参数来指定 Text 可组合函数的字体大小和字重:

@Composable
fun DemoScreen() {Text("My Vacation",fontSize = 40.sp,  // 字体大小参数fontWeight = FontWeight.Bold  // 字重参数)
}

大多数内置可组合函数还会接收一个可选的 modifier(修饰符)参数用于配置外观和行为。与 “通常特定于某类可组合函数” 的参数不同(例如,字体设置对 Column 组件没有意义),修饰符的通用性更强 —— 它们可以应用于任何可组合函数。

构建修饰符的基础是 Modifier 对象。Modifier 是 Compose 内置的一个对象,用于存储可应用于可组合函数的配置设置。它提供了丰富的方法,可用于配置边框、内边距、背景、尺寸要求、事件处理器、手势等多种属性等)。修饰符一旦声明,就可以传递给其他可组合函数,用于改变其外观和行为。

26.2 创建 ModifierDemo 项目

启动 Android Studio,新建 “Empty Activity” 模板,点击 “Next”,“Name” 输入 ModifierDemo,并将包名指定为 com.example.modifierdemo,将 “Minimum API level” 设置为 API 26: Android 8.0 (Oreo),点击 “Finish”。

将 MainActivity.kt 文件加载到代码编辑器中,删除 Greeting 可组合函数,然后按以下方式修改代码:

class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContent {ModifierDemoTheme {Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->// 调用 DemoScreen 并传入内边距修饰符DemoScreen(Modifier.padding(innerPadding))}}}}
}@Composable
fun DemoScreen(modifier: Modifier = Modifier) {Text("Hello Compose",fontSize = 40.sp,       // 字体大小 40spfontWeight = FontWeight.Bold  // 字重为粗体)
}@Preview(showBackground = true)  // 预览时显示背景
@Composable
fun DefaultPreview() {ModifierDemoTheme {DemoScreen()}
}

Modifier 使用

第一步是创建一个修饰符。首先,我们可以创建一个不带任何配置的修饰符,代码如下:

val modifier = Modifier

这本质上是一个空白修饰符,不包含任何配置设置。要配置修饰符需调用其方法。例如,可通过以下代码配置修饰符,为应用它的可组合函数的四个边都添加 10dp 的内边距:

val modifier = Modifier.padding(all = 10.dp)

修饰符实例的方法可链式调用。例如,以下代码在原有基础上为修饰符添加 “2dp 宽的黑色边框” 配置,使应用该修饰符的可组合函数周围显示边框:

val modifier = Modifier.padding(all = 10.dp)  // 先添加内边距.border(width = 2.dp, color = Color.Black)  // 再添加边框

不过在我们的示例中,DemoScreen 已经接收了一个包含 innerPadding(从 onCreate() 方法传递的内边距)的修饰符参数。因此,我们无需创建新的空白修饰符,而是可以基于这个已有修饰符,追加内边距和边框设置,这样就能保留原有的内边距属性:

@Composable
fun DemoScreen(modifier: Modifier = Modifier) {// 基于传入的 modifier 追加配置,保留原有属性val mymodifier = modifier.border(width = 2.dp, color = Color.Black)  // 添加边框.padding(all = 10.dp)  // 添加内边距// ...
}

修饰符创建完成后,可以传递给任何接收 modifier 参数的可组合函数。修改 DemoScreen 函数,将我们创建的修饰符传递给 Text 可组合函数,代码如下:

@Composable
fun DemoScreen(modifier: Modifier = Modifier) {val mymodifier = modifier.border(width = 2.dp, color = Color.Black).padding(all = 10.dp)Text("Hello Compose",modifier = mymodifier,  // 应用自定义修饰符fontSize = 40.sp,fontWeight = FontWeight.Bold)
}

预览布局时,效果应如下图所示。从预览中可以看到,文本已应用了内边距和边框。显然,Text 可组合函数的实现中包含了接收修饰符的参数。

效果预览示例图

注意:如果一个可组合函数接收修饰符参数,该参数总是参数列表中的第一个可选参数。这带来一个额外好处:传递修饰符时可以省略参数名。例如,以下写法在语法上是正确的:

Text("Hello Compose",mymodifier,  // 省略 modifier = ,直接传递修饰符fontSize = 40.sp,fontWeight = FontWeight.Bold
)

26.4 Modifier 顺序

修饰符链式调用的顺序,对最终呈现效果有至关重要的影响。在之前的示例中,我们先应用了边框(border),再应用内边距(padding)—— 这会导致边框显示在内边距的外侧。

若要让边框显示在内边距的内侧,需要交换修饰符的顺序,代码如下:

val mymodifier = modifier.padding(all = 10.dp)  // 先添加内边距.border(width = 2.dp, color = Color.Black)  // 再添加边框

预览时,Text 可组合函数的显示效果应如下图所示。

修饰符顺序对界面的影响

需要注意的是:如果使用链式修饰符时未看到预期效果,大概率是因为修饰符的应用顺序不符合预期,此时应优先检查并调整调用顺序。

Modifier 可组合函数使用

本章到目前为止,我们已演示了如何创建修饰符并将其用于内置可组合函数。开发自定义可组合函数时,需考虑是否添加修饰符支持 —— 这能让函数的配置性更强。

为可组合函数添加修饰符支持有两个核心规则:

  • 修饰符参数必须命名为 modifier;
  • 该参数需作为函数参数列表中的第一个可选参数。

步骤 1:创建基础自定义可组合函数,以添加一个名为 CustomImage 的新可组合函数为例,它接收 “待显示的图片资源” 作为参数。先在 MainActivity.kt 中添加基础版本的函数,并导入所需依赖:

// 新增必要导入:用于图片渲染和资源加载
@Composable
fun CustomImage(image: Int) {Image(painter = painterResource(image),  // 加载传入的图片资源contentDescription = null          // 此处暂不设置图片描述(实际项目建议补充))
}

步骤 2:添加 modifier 参数,当前 CustomImage 仅接收图片资源参数,下一步需添加 modifier 参数。注意,修饰符参数必须是可选参数(即设置默认值),确保函数可在不传递修饰符的情况下被调用:

// 错误写法:未设置默认值,modifier 变成必传参数
@Composable
fun CustomImage(image: Int, modifier: Modifier) { ... }// 正确写法:以空 Modifier 实例为默认值,保留可选性
@Composable
fun CustomImage(image: Int, modifier: Modifier = Modifier) { ... }

步骤 3:将修饰符应用到内部组件,需将 modifier 参数传递给 CustomImage 内部的 Image 组件(遵循 “修饰符作为第一个可选参数” 的规则),确保外部传递的修饰符能生效:

@Composable
fun CustomImage(image: Int, modifier: Modifier = Modifier) {Image(painter = painterResource(image),contentDescription = null,modifier = modifier  // 应用外部传递的修饰符(可省略 = modifier,直接写 modifier)// 简化写法:modifier  // 因是第一个可选参数,可省略参数名)
}

现在我们已经创建了支持修饰符的新可组合函数,接下来几乎可以在 DemoScreen 函数中调用它了。在此之前需要先为项目添加一张图片资源。该图片名为 vacation.jpg。

vacation

添加图片资源的步骤如下:

  • 点击下图中高亮显示的按钮,打开 “Resource Manager”(资源管理器)工具窗口。
  • 在计算机中找到刚下载的 vacation.png 图片。
  • 将该图片拖拽到 “Resource Manager” 工具窗口中。
  • 在弹出的对话框中,先点击 “Next”,再点击 “Import” 按钮,即可将图片添加到项目中。

Android Studio 添加图片

这张图片会显示在 res -> drawable 目录下。

显示添加的资源文件
接下来,修改 DemoScreen 可组合函数,添加对 CustomImage 组件的调用。首先需导入必要依赖,再调整布局结构,完整代码如下:

@Composable
fun DemoScreen(modifier: Modifier = Modifier) {// 自定义修饰符:黑色2dp边框 + 10dp内边距val mymodifier = modifier.border(width = 2.dp, color = Color.Black).padding(all = 10.dp)// 垂直布局容器:整体20dp内边距 + 子元素水平居中 + 垂直居中排列Column(modifier = Modifier.padding(20.dp),horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.Center) {// 文本组件:应用自定义修饰符Text("Hello Compose",mymodifier,  // 省略 modifier = ,直接传递修饰符fontSize = 40.sp,fontWeight = FontWeight.Bold)// 间距组件:文本与图片之间添加16dp垂直间距Spacer(modifier = Modifier.height(16.dp))// 自定义图片组件:引用 vacation 图片资源CustomImage(image = R.drawable.vacation)}
}

刷新并构建预览,确认布局显示效果与下图一致。

案例演示

目前,Image 组件使用的是我们在 CustomImage 函数签名中声明的默认 Modifier 实例。若要修改图片的显示效果,需构建一个自定义修饰符并传递给 CustomImage:

// 新增必要导入:用于圆角形状和裁剪效果
Spacer(Modifier.height(16.dp))// 调用 CustomImage 并传递自定义修饰符
CustomImage(image = R.drawable.vacation,modifier = Modifier.padding(16.dp)  // 图片四周添加16dp内边距.width(270.dp)   // 固定图片宽度为270dp.clip(shape = RoundedCornerShape(30.dp))  // 裁剪为30dp圆角
)

此时预览应显示出带有以下效果的图片:四周有内边距、固定宽度、圆角边角。

带额外效果图片

Modifier 内置修饰符

Modifier 类包含的方法总数超出了本书的覆盖范围(目前已超过 100 个)。若需查看完整的方法列表及详细说明,可参考 Compose 官方文档链接:https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier

以下是部分最常用的修饰符方法及其功能说明:

修饰符方法功能描述
修饰符方法 功能描述
background在可组合函数后方绘制一个纯色形状(即设置背景)。
clickable为可组合函数设置点击事件处理器;点击时还会触发水波纹交互效果。
clip将可组合函数的内容裁剪为指定的形状(如圆角、圆形)。
fillMaxHeight使可组合函数的高度适配其父组件允许的最大高度。
fillMaxSize使可组合函数的宽高均适配其父组件允许的最大尺寸(填满父组件)。
fillMaxWidth使可组合函数的宽度适配其父组件允许的最大宽度。
layout用于实现自定义布局逻辑,具体内容将在 “构建自定义布局” 章节中讲解。
offset沿 X 轴和 Y 轴方向,将可组合函数从当前位置偏移指定距离。
padding在可组合函数周围添加间距;可通过参数设置 “四边统一间距” 或 “每边单独间距”。
rotate以可组合函数的中心点为轴,将其旋转指定的角度(单位:度)。
scale按指定的缩放因子放大或缩小可组合函数的尺寸。
scrollable为 “超出所在布局可视区域” 的可组合函数启用滚动功能。
size用于指定可组合函数的宽高;若未设置该修饰符,组件将自适应内容尺寸(即 “包裹内容”)。

组合修饰符

在使用 Compose 时,可能会遇到需要将两个或多个 Modifier 对象应用到同一个可组合函数的场景。针对这种情况,Compose 允许通过 then 关键字来组合修饰符,语法如下:

val combinedModifier = firstModifier.then(secondModifier).then(thirdModifier) // 可链式组合多个

组合后的修饰符会包含所有指定修饰符的配置,相当于将多个修饰符的效果叠加生效。

为了直观理解组合效果,我们修改 MainActivity.kt 文件,新增一个修饰符,再将它与原有修饰符组合后应用到 Text 组件:

  1. 定义两个独立修饰符
// 原有修饰符:黑色2dp边框 + 10dp内边距
val mymodifier = Modifier.border(width = 2.dp, color = Color.Black).padding(all = 10.dp)// 新增修饰符:固定高度100dp
val secondModifier = Modifier.height(100.dp)
  1. 用 then 组合修饰符并应用到 Text
Text("Hello Compose",modifier = mymodifier.then(secondModifier), // 组合两个修饰符fontSize = 40.sp,fontWeight = FontWeight.Bold
)

此时在预览面板中,Text 组件会同时呈现以下效果:

  • 原有配置:指定字体(40sp、粗体)、黑色边框、10dp 内边距
  • 新增配置:100dp 固定高度

小结

修饰符通过 Compose 的 Modifier 对象实例创建,作为参数传递给可组合函数以改变其外观和行为。配置修饰符时,需调用 modifier 对象的方法来定义尺寸、内边距、旋转角度、背景色等设置。

Compose 系统提供的大多数内置可组合函数都支持接收修饰符作为参数。同时,为自定义可组合函数添加修饰符支持也是可行且推荐的做法。若一个可组合函数接收修饰符,该参数始终是参数列表中的第一个可选参数,但会排在所有必选参数之后。

多个修饰符实例可通过 then 关键字组合后,再应用到同一个组件上。

http://www.dtcms.com/a/529674.html

相关文章:

  • 19、面向对象-特殊方法
  • 电影网站建设视频教程wordpress小工具制作
  • 国外app素材网站怎么用网站后台做轮播图
  • 我用帝国做的网站上传到别一个服务器上重新邦了一个域名php 茶叶网站建设
  • 网站域名如何影响seo科技管理信息网站的建设方案
  • 雅菲奥朗人工智能知识墙分享(一):『AI算法:智能时代的“数学灵魂”』
  • 【文献阅读】Deep-learning-aided dismantling of interdependent networks
  • 关系模式的规范化设计理论(下)
  • 网站建设的服务怎么样湖州做网站公司哪家好
  • windows搭建php网站一个网站上线的时间
  • 软件开发工程师需要具备的能力沧州搜索引擎优化
  • 故城建设银行网站一个完整的产品规划方案
  • 免费网站加速服务重庆市住建局官方网站
  • 网站开发页面设计报价茶叶网站flash模板免费下载
  • 泰安网站建设泽讯搜狗站长平台验证不了
  • 网站建设珠江摩尔做电商都需要什么
  • 五子棋游戏完整项目文档
  • 广州互帮物流哪家公司做的网站怎么注册网自己的网站
  • spiderdemo第四题
  • 网站开发电销常遇到问题郴州网站建设价格
  • 青浦网站制作公司wordpress 图片调用api接口
  • 最大频率栈
  • 辽宁双高建设专题网站怎么看一个网站有没有做百度推广
  • Dify异步接口调用优化实践:解决长时任务处理与网络超时问题
  • wordpress小图标网站百度快速排名 搜
  • 还在“手动开关图层”?Photoshop“图层复合”的UI多状态批量导出工作流
  • [人工智能-大模型-73]:模型层技术 - 模型训练六大步:②数据选择:基本功能与对应的基本组成函数
  • 河北黄骅市简介seo优化常识
  • 南京百度网站制作app备案查询平台官网
  • go-ethereum core之statedb