android 如何在Jetpack排版中添加边距?

sauutmhj  于 2023-02-02  发布在  Android
关注(0)|答案(8)|浏览(136)

如何在Jetpack Compose中添加Margin?
我可以看到有一个Modifier用于填充Modifier.padding(...),但我似乎找不到一个用于边距,或者我瞎了吗?
请给我带路。
非常感谢。

envsm3lx

envsm3lx1#

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

val shape = CircleShape
Text(
    text = "Text 1",
    style = TextStyle(
        color = Color.White,
        fontWeight = FontWeight.Bold,
        textAlign = TextAlign.Center),
    modifier = Modifier.fillMaxWidth()
        .padding(16.dp)
        .border(2.dp, MaterialTheme.colors.secondary, shape)
        .background(MaterialTheme.colors.primary, shape)
        .padding(16.dp)
)

将导致:

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

anauzrmj

anauzrmj2#

paddingmargin 的Angular 来考虑,你指的是我们所习惯的所谓的盒子模型。在Compose中没有盒子模型,而是一系列修饰符,这些修饰符应用于给定的可组合对象。诀窍在于你可以多次应用相同的修饰符,如padding或border,例如order of these matters

@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
    )
}

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

修改器文档中详细解释了此设计:
注意:显式的顺序有助于你理解不同的修饰符是如何交互的。与基于视图的系统相比,在基于视图的系统中,你必须学习框模型,即边距应用于元素的“外部”,但填充“内部”,背景元素将相应地调整大小。修饰符设计使这种行为显式和可预测,并给你更多的控制来实现你想要的确切行为。

r9f1avp5

r9f1avp53#

您还可以使用间隔符

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

它表示空白布局,其大小可以使用Modifier.widthModifier.heightModifier.size修饰符定义。
假设您想在两个可合成对象之间添加边距,则可以通过以下方式实现

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)
jmo0nnb3

jmo0nnb34#

边距与填充不同,边距是小部件外部的空间,而填充是小部件内部的距离,在旧的XML中,您可以显式地决定使用哪一个,但是新的组合方式不同。
怎样排版处理填充物和页边距?
有一个对象可以设置为组合对象的参数,叫做Modifier,你可以用它来做边距和填充。
填充示例:

Text(
    text = "Test",
    modifier = Modifier
        .padding(16.dp)
        .clickable { }
)

保证金示例

Text(
    text = "Test",
    modifier = Modifier
        .clickable { }
        .padding(16.dp)
)

正如您所看到的,顺序在组合中起着重要作用,所有修饰符都是按顺序实现的。

yyyllmsg

yyyllmsg5#

因此,从我阅读文档后所能理解的,没有API设计师认为的那样的利润修饰符,给本质上做同样事情的东西起不同的名字是多余的。
假设您希望在将容器着色为黄色背景之前应用8dp的边距,并且希望容器的内容填充为4dp。

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

在上面的例子中,你可以看到我首先应用了填充,然后我给容器添加了背景色,最后是最后一个填充。这是它的外观。就像我们预期的那样。

lb3vh1jj

lb3vh1jj6#

我也在寻找一些东西,它应该给我一个直接的选项来设置像TextView这样的视图的边距。但不幸的是,我们在Jetpack组合中没有边距支持。但好消息是,我们仍然可以通过使用像Box这样的布局容器来实现它,它允许我们添加像TextView这样的视图。ImageView等,所以你可以添加边距的任何子(TextView)通过使用填充修饰符的父(框).下面是代码:

Box(Modifier.padding(10.dp)) {
    Surface(color = Color.LightGray) {
        Text(text = "Hello $text!", color = Color.Blue,
            modifier = Modifier.padding(16.dp))
    }
}

结果是:

在这里我给了10.dp填充框。希望它是有用的。

x6492ojm

x6492ojm7#

你可以通过把你的内容放在一个不同的可组合对象如Box中,并使外部可组合对象clickable成为可组合对象,来达到与margin相同的效果。使用这种方法,内部填充区域将被包括在可点击内容中。

cnjp1d6j

cnjp1d6j8#

您可以通过使用带有填充a的嵌套 * a * 表面**元素来实现边距效果,例如

@Composable
fun MainScreen() {
    Surface(color=Color.Yellow, modifier=Modifier.padding(10.dp)){
        Surface(color=Color.Magenta, modifier=Modifier.padding(30.dp)) {
            Surface(
               color = Color.Green, 
               modifier = Modifier.padding(10.dp).wrapContentSize()) {
               Text(text = "My Dummy Text", color = Color.Black)
            }
        }
    }
}

相关问题