How to add Margin in Jetpack Compose?
You can consider padding and margin as the same thing (imagine it as "spacing"). A padding can be applied twice (or more) in the same composable and achieve the similar behavior you would get with margin+padding. For example:
val shape = CircleShapeText( 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))
Will result on this:
As you can see, the first padding
is adding a space between the component and its border. Then the background and border are defined. Finally, a new padding
is set to add space between the border and the text.
Thinking in terms of padding and margin you refer to the so-called box model that we are used to. There's no a box model in Compose but a sequence of modifiers which is applied to a given composable. The trick is that you can apply the same modifier like padding or border multiple times and the order of these matters, for example:
@Composablefun 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 )}
As the result you'll get this composable:
This design is well explained in the Modifiers documentation:
Note: The explicit order helps you to reason about how different modifiers will interact. Compare this to the view-based system where you had to learn the box model, that margins applied "outside" the element but padding "inside" it, and a background element would be sized accordingly. The modifier design makes this kind of behavior explicit and predictable, and gives you more control to achieve the exact behavior you want.
You can achieve the same effect as margin with putting your content, that has padding, inside a different composable like Box
and make outer composable clickable
. With this approach, inner padded areas will be included in clickable content.