Skip to content

使用修饰符

修饰符允许您装饰或增强可组合项。使用修饰符,您可以:

  • 更改可组合项的大小、布局、行为和外观。
  • 添加信息,例如无障碍标签。
  • 处理用户输入。
  • 添加高级交互,例如使元素可点击、可滚动、可拖动或可缩放。

链式修饰符

修饰符可以链式连接在一起以应用多个效果:

kotlin
@Composable
private fun Greeting(name: String) {
    Column(
        // 链式 `Modifier` 函数:
        modifier = Modifier
            // `Modifier.padding(24.dp)` 为 `Column` 添加内边距
            .padding(24.dp)
            // `Modifier.fillMaxWidth()` 使 `Column` 扩展以填充可用宽度
            .fillMaxWidth()
    ) {
        Text(text = "Hello,")
        Text(text = name)
    }
}

修饰符函数在链中的顺序至关重要。每个函数都会对前一个函数返回的 Modifier 进行更改,因此调用序列直接影响可组合项的最终行为和外观。

内置修饰符

Compose Multiplatform 提供内置修饰符,例如 sizepaddingoffset,用于处理常见的布局和定位任务。

大小修饰符

要设置固定大小,请使用 size 修饰符。当需要覆盖约束时,请使用 requiredSize 修饰符:

kotlin
@Composable
fun Card() {
    // 将 `Row` 的大小设置为 400x100 dp
    Row(modifier = Modifier.size(width = 400.dp, height = 100.dp)
    ) {
        Image(
            // 将所需大小设置为 150x150 dp 并覆盖父级 100 dp 的限制
            modifier = Modifier.requiredSize(150.dp)
        )
        Column {
            // 内容占据 `Row` 内的剩余空间
        }
    }
}

内边距修饰符

使用 padding 修饰符为元素添加内边距。您还可以使用 paddingFromBaseline 根据基线动态应用内边距:

kotlin
@Composable
fun Card() {
    Row {
        Column {
            // 应用内边距以调整相对于基线的位置
            Text(
                text = "Title",
                modifier = Modifier.paddingFromBaseline(top = 50.dp)
            )
            // 由于未指定内边距,因此遵循默认排列
            Text(text = "Subtitle")
        }
    }
}

偏移修饰符

要调整布局相对于其原始位置的位置,请使用 offset 修饰符。指定 X 轴和 Y 轴上的偏移量:

kotlin
@Composable
fun Card() {
    Row {
        Column {
            // 正常定位文本,不应用任何偏移
            Text(text = "Title")
            
            // 沿 X 轴向右轻微移动文本 4.dp,
            // 同时保持原始垂直位置
            Text(
                text = "Subtitle",
                modifier = Modifier.offset(x = 4.dp)
            )
        }
    }
}

作用域修饰符

作用域修饰符,也称为父数据修饰符,会通知父布局子级的特定要求。例如,要匹配父级 Box 的大小,请使用 matchParentSize 修饰符:

kotlin
@Composable
fun MatchParentSizeComposable() {
    Box {
        // 获取其父级 `Box` 的大小
        Spacer(
            Modifier
                .matchParentSize() 
                .background(Color.LightGray)
        )
        // 最大的子级,决定 `Box` 的大小
        Card()
    }
}

作用域修饰符的另一个例子是 weight,它在 RowScopeColumnScope 中可用。它决定可组合项应相对于其同级元素占据多少空间:

kotlin
@Composable
fun Card() {
    Row(
        // 占据其父级的全部宽度
        modifier = Modifier.fillMaxWidth() 
    ) {
        Image(
            /* 用于加载图像的占位符 */,
            // 分配 1f 的权重以占据可用空间的一部分
            modifier = Modifier.weight(1f) 
        )
        
        Column(
            // 分配 2f 的权重,占据 `Image` 两倍的宽度
            modifier = Modifier.weight(2f)
        ) {
            // `Column` 内部的内容
        }
    }
}

提取和重用修饰符

当您将修饰符链式连接在一起时,您可以将该链提取到变量或函数中以进行重用。这可以提高代码可读性,并通过重用修饰符实例来提升性能。

kotlin
val commonModifier = Modifier
    .padding(16.dp)
    .background(Color.LightGray)

@Composable
fun Example() {
    // 应用带有内边距和背景色的可重用修饰符
    Text("Reusable modifier", modifier = commonModifier)

    // 为 `Button` 重用相同的修饰符
    Button(
        onClick = { /* Do something */ },
        modifier = commonModifier
    )
    {
        Text("Button with the same modifier")
    }
}

自定义修饰符

虽然 Compose Multiplatform 开箱即用提供了许多用于常见用例的内置修饰符,但您也可以创建自己的自定义修饰符。

有几种创建自定义修饰符的方法:

接下来

Jetpack Compose 文档 中了解更多关于修饰符的信息。