如何在 Jetpack Compose 中添加保证金?

Arc*_*nes 31 android android-jetpack-compose

您究竟如何才能在 中添加 Margin Jetpack Compose

我可以看到有一个Modifier用于填充,Modifier.padding(...)但我似乎无法找到一个用于边距的,或者我是瞎子吗?

请有人指导我。

非常感谢。

ank*_*ag2 50

您还可以使用Spacer

Spacer(modifier = Modifier.width(10.dp))
Run Code Online (Sandbox Code Playgroud)

它表示一个空白空间布局,其大小可以使用Modifier.width,Modifier.heightModifier.size修饰符来定义。

假设您想在 2 个可组合项之间添加边距,那么您可以通过以下方式实现

Text(
    text = stringResource(id = R.string.share_your_posters),
    fontSize = 16.sp,
    color = Color.Black
)

Spacer(modifier = Modifier.width(10.dp))

Image(painter = painterResource(id = R.drawable.ic_starts), contentDescription = null)
Run Code Online (Sandbox Code Playgroud)


ngl*_*ber 36

您可以将填充和边距视为同一件事(将其想象为“间距”)。可以在同一个可组合中应用两次(或更多)填充,并实现与使用边距+填充获得的类似行为。例如:

val shape = CircleShape
Text(
    text = "Text 1",
    style = TextStyle(
        color = Color.White,
        fontWeight = FontWeight.Bold,
        textAlign = TextAlign.Center),
    modifier = Modifier.fillMaxWidth()
        .padding(16.dp)
        .drawBorder(2.dp, MaterialTheme.colors.secondary, shape)
        .drawBackground(MaterialTheme.colors.primary, shape)
        .padding(16.dp)
)
Run Code Online (Sandbox Code Playgroud)

将导致:

在此处输入图片说明

如您所见,第一个padding是在组件与其边框之间添加一个空格。然后定义背景和边框。最后,padding设置一个 new以在边框和文本之间添加空间。

  • 这个愚蠢的论点,因为边距是元素周围的空间,而填充是指元素与其内部内容之间的空间。一个可以为 ie 小部件的可点击做出贡献,另一个则不会。所以,是的,从视觉上看,它可以被认为只是间距,但类型不同,因此在功能上并不等同。 (14认同)
  • 我与 UI 工具包的 Adam Powell 和 Leland Richardson 进行了长时间的讨论,并引用 Leland 的话:_“实际上,“填充”实际上只是“间距”_...所以如果负责 Compose 编译器/运行时的人这么说,我可以这么说;) (6认同)
  • @MarcinOrlowski:“因为边距是元素周围的空间,而填充是指元素与其内部内容之间的空间”——在 Compose 中,实际上不存在您所思考的“元素”。FWIW,[这篇文章](https://jetc.dev/slack/2020-07-05-space-by-any-other-name.html)总结了 nglauber 引用的 Slack 线程,并有指向该线程的链接,如果您有兴趣阅读原始讨论。 (5认同)
  • 正如您在上面的回答中看到的,第一个填充/间距就像边距一样。然后,我添加边框和背景。然后我添加另一个填充,其作用类似于我们在当前 UI 框架上熟悉的填充。如果您在同一示例中添加可点击修饰符,您会注意到背景/边框之外的区域不可点击。这就是为什么我说填充和边距是同一件事,具体取决于您在哪里使用它。 (4认同)
  • 您不能将边距和填充视为相同。 (3认同)
  • 但我还是不明白。所以如果我有一个按钮,我想在其中添加边距。我只需添加填充吗?或者我做类似`Container(modifier = Modifier.padding(16.dp) ) { Button() }`? (2认同)
  • 有点...要向“按钮的内容”(即文本)添加填充,您可以使用`Button(text= { Text("OK",modifier=Modifier.padding(16.dp)) }, onClick={})`。请注意,“text”属性是一个可组合项。 (2认同)
  • 好的,这是有道理的,但是不接受像“TopAppBar”这样的单个小部件的小部件怎么样,执行“TopAppbar(modifier = Modifier.padding(16.dp)) { ... }”在“AppBar”周围添加空白而不是将其添加到其宽度和高度。`TopAppBar` 可以有来自 `title`、`navigationIcon`、`action` 等的子级。谁会有填充? (2认同)
  • 疯了吧! (2认同)
  • 文本字段呢?它的文本不是可组合的,因此无法在其中添加填充。同时,它的背景不是被定义为修饰符,而是被定义为参数“形状”,无论如何,它都会在修饰符之前应用。旧的填充将包括背景形状,而边距则不会。现在我只有边距,无法移动文本(我需要将文本放在 Xdp 到 CircleShape 开始的右侧)。 (2认同)

ana*_*bek 32

在 Compose 中,修饰符的顺序很重要。

如果您在其他所有内容padding 之前使用,它的行为就像padding
如果您在其他所有内容padding 之后使用,它的行为就像margin

在此输入图像描述

在此输入图像描述

  • 该死!这应该是 Google 的 Jetpack Compose 教程页面上的第一个声明 (3认同)

هيث*_*يثم 18

margin 与 padding 不同,margin 是 widget 外部的空间,padding 是 widget 内部的距离,在旧的 XML 中你可以明确决定使用哪一个,但是新的 compose 方式是不同的。

如何处理填充和边距?

有一个对象可以设置为可组合项的参数,称为Modifier,您可以使用它来执行边距和填充。

填充示例:

    Text(
    text = "Test",
    modifier = Modifier
        .padding(16.dp)
        .clickable { }
)
Run Code Online (Sandbox Code Playgroud)

保证金示例

    Text(
    text = "Test",
    modifier = Modifier
        .clickable { }
        .padding(16.dp)
)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,顺序在组合中有所不同,所有修饰符都是按顺序实现的。

  • 第一个示例演示边距,而不是填充。如果您首先在修饰符中应用“填充”,它将影响可组合项的外部,而不是内部 (2认同)

Val*_*kov 16

考虑填充边距,您指的是我们习惯的所谓的盒模型。Compose 中没有盒子模型,而是一系列应用于给定组合的修饰符。诀窍是您可以多次应用相同的修饰符,例如填充边框,并且这些修饰符的顺序很重要,例如:

@Composable
fun PaddingExample() {
    Text(
        text = "Hello World!",
        color = Color.White,
        modifier = Modifier
            .padding(8.dp) // margin
            .border(2.dp, Color.White) // outer border
            .padding(8.dp) // space between the borders
            .border(2.dp, Color.Green) // inner border
            .padding(8.dp) // padding
    )
}
Run Code Online (Sandbox Code Playgroud)

结果你会得到这个可组合的:

在此处输入图片说明

这种设计在Modifiers 文档中有很好的解释:

注意:显式顺序可帮助您推断不同修饰符将如何相互作用。将此与基于视图的系统进行比较,在该系统中您必须学习框模型,边距应用于元素“外部”但填充“内部”,并且背景元素将相应地调整大小。修改器设计使这种行为明确且可预测,并为您提供更多控制以实现您想要的确切行为。


pra*_*kar 6

因此,根据我在阅读文档后的理解,没有边距修饰符,例如 API 设计者认为给出本质上做同样事情的不同名称是多余的。

假设您希望在用黄色背景为容器着色之前应用 8dp 的边距,并且希望容器的内容填充为 4dp。

Column(modifier = Modifier.padding(all = 8.dp)
                          .background(color = Color.Yellow)
                          .padding(all=4.dp)) {
        Text(text = "Android")
        ...
    }
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您可以看到我首先应用了填充,然后向容器添加了背景颜色,最后添加了最后的填充。它看起来是这样的。正如我们所想的那样。 在此输入图像描述