Surface
Component in Material 3 Compose
Material surface is the central metaphor in material design. Each surface exists at a given elevation, which influences how that piece of surface visually relates to other surfaces and how that surface is modified by tonal variance.
See the other overloads for clickable, selectable, and toggleable surfaces.
The Surface is responsible for:
- Clipping: Surface clips its children to the shape specified by [shape]
- Borders: If [shape] has a border, then it will also be drawn.
- Background: Surface fills the shape specified by [shape] with the [color]. If [color] is [ColorScheme.surface] a color overlay will be applied. The color of the overlay depends on the [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any parent surfaces. This ensures that a Surface never appears to have a lower elevation overlay than its ancestors, by summing the elevation of all previous Surfaces.
- Content color: Surface uses [contentColor] to specify a preferred color for the content of this surface - this is used by the [Text] and [Icon] components as a default color.
If no [contentColor] is set, this surface will try and match its background color to a color defined in the theme [ColorScheme], and return the corresponding content color. For example, if the [color] of this surface is [ColorScheme.surface], [contentColor] will be set to [ColorScheme.onSurface]. If [color] is not part of the theme palette, [contentColor] will keep the same value set above this Surface.
To manually retrieve the content color inside a surface, use [LocalContentColor]. 5) Blocking touch propagation behind the surface.
Last updated:
Installation
dependencies {
implementation("androidx.compose.material3:material3:1.4.0-alpha02")
}
Overloads
@Composable
@NonRestartableComposable
fun Surface(
modifier: Modifier = Modifier,
shape: Shape = RectangleShape,
color: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(color),
tonalElevation: Dp = 0.dp,
shadowElevation: Dp = 0.dp,
border: BorderStroke? = null,
content: @Composable () -> Unit
)
Parameters
name | description |
---|---|
modifier | Modifier to be applied to the layout corresponding to the surface |
shape | Defines the surface's shape as well its shadow. |
color | The background color. Use [Color.Transparent] to have no color. |
contentColor | The preferred content color provided by this Surface to its children. Defaults to either the matching content color for [color], or if [color] is not a color from the theme, this will keep the same value set above this Surface. |
tonalElevation | When [color] is [ColorScheme.surface], a higher the elevation will result in a darker color in light theme and lighter color in dark theme. |
shadowElevation | The size of the shadow below the surface. To prevent shadow creep, only apply shadow elevation when absolutely necessary, such as when the surface requires visual separation from a patterned background. Note that It will not affect z index of the Surface. If you want to change the drawing order you can use Modifier.zIndex . |
border | Optional border to draw on top of the surface |
content | The content to be displayed on this Surface |
@Composable
@NonRestartableComposable
fun Surface(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
shape: Shape = RectangleShape,
color: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(color),
tonalElevation: Dp = 0.dp,
shadowElevation: Dp = 0.dp,
border: BorderStroke? = null,
interactionSource: MutableInteractionSource? = null,
content: @Composable () -> Unit
)
Parameters
name | description |
---|---|
onClick | callback to be called when the surface is clicked |
modifier | Modifier to be applied to the layout corresponding to the surface |
enabled | Controls the enabled state of the surface. When false , this surface will not be clickable |
shape | Defines the surface's shape as well its shadow. A shadow is only displayed if the [tonalElevation] is greater than zero. |
color | The background color. Use [Color.Transparent] to have no color. |
contentColor | The preferred content color provided by this Surface to its children. Defaults to either the matching content color for [color], or if [color] is not a color from the theme, this will keep the same value set above this Surface. |
border | Optional border to draw on top of the surface |
tonalElevation | When [color] is [ColorScheme.surface], a higher the elevation will result in a darker color in light theme and lighter color in dark theme. |
shadowElevation | The size of the shadow below the surface. Note that It will not affect z index of the Surface. If you want to change the drawing order you can use Modifier.zIndex . |
interactionSource | an optional hoisted [MutableInteractionSource] for observing and emitting [Interaction]s for this surface. You can use this to change the surface's appearance or preview the surface in different states. Note that if null is provided, interactions will still happen internally. |
content | The content to be displayed on this Surface |
@Composable
@NonRestartableComposable
fun Surface(
selected: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
shape: Shape = RectangleShape,
color: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(color),
tonalElevation: Dp = 0.dp,
shadowElevation: Dp = 0.dp,
border: BorderStroke? = null,
interactionSource: MutableInteractionSource? = null,
content: @Composable () -> Unit
)
Parameters
name | description |
---|---|
selected | whether or not this Surface is selected |
onClick | callback to be called when the surface is clicked |
modifier | Modifier to be applied to the layout corresponding to the surface |
enabled | Controls the enabled state of the surface. When false , this surface will not be clickable |
shape | Defines the surface's shape as well its shadow. A shadow is only displayed if the [tonalElevation] is greater than zero. |
color | The background color. Use [Color.Transparent] to have no color. |
contentColor | The preferred content color provided by this Surface to its children. Defaults to either the matching content color for [color], or if [color] is not a color from the theme, this will keep the same value set above this Surface. |
border | Optional border to draw on top of the surface |
tonalElevation | When [color] is [ColorScheme.surface], a higher the elevation will result in a darker color in light theme and lighter color in dark theme. |
shadowElevation | The size of the shadow below the surface. Note that It will not affect z index of the Surface. If you want to change the drawing order you can use Modifier.zIndex . |
interactionSource | an optional hoisted [MutableInteractionSource] for observing and emitting [Interaction]s for this surface. You can use this to change the surface's appearance or preview the surface in different states. Note that if null is provided, interactions will still happen internally. |
content | The content to be displayed on this Surface |
@Composable
@NonRestartableComposable
fun Surface(
checked: Boolean,
onCheckedChange: (Boolean) -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
shape: Shape = RectangleShape,
color: Color = MaterialTheme.colorScheme.surface,
contentColor: Color = contentColorFor(color),
tonalElevation: Dp = 0.dp,
shadowElevation: Dp = 0.dp,
border: BorderStroke? = null,
interactionSource: MutableInteractionSource? = null,
content: @Composable () -> Unit
)
Parameters
name | description |
---|---|
checked | whether or not this Surface is toggled on or off |
onCheckedChange | callback to be invoked when the toggleable Surface is clicked |
modifier | Modifier to be applied to the layout corresponding to the surface |
enabled | Controls the enabled state of the surface. When false , this surface will not be clickable |
shape | Defines the surface's shape as well its shadow. A shadow is only displayed if the [tonalElevation] is greater than zero. |
color | The background color. Use [Color.Transparent] to have no color. |
contentColor | The preferred content color provided by this Surface to its children. Defaults to either the matching content color for [color], or if [color] is not a color from the theme, this will keep the same value set above this Surface. |
border | Optional border to draw on top of the surface |
tonalElevation | When [color] is [ColorScheme.surface], a higher the elevation will result in a darker color in light theme and lighter color in dark theme. |
shadowElevation | The size of the shadow below the surface. Note that It will not affect z index of the Surface. If you want to change the drawing order you can use Modifier.zIndex . |
interactionSource | an optional hoisted [MutableInteractionSource] for observing and emitting [Interaction]s for this surface. You can use this to change the surface's appearance or preview the surface in different states. Note that if null is provided, interactions will still happen internally. |
content | The content to be displayed on this Surface |
Code Examples
SurfaceSample
@Preview
@Composable
fun SurfaceSample() {
Surface { Text("Text on Surface") }
}
ClickableSurfaceSample
@Preview
@Composable
fun ClickableSurfaceSample() {
var count by remember { mutableStateOf(0) }
Surface(
onClick = { count++ },
) {
Text("Clickable Surface. Count: $count")
}
}
SelectableSurfaceSample
@Preview
@Composable
fun SelectableSurfaceSample() {
var selected by remember { mutableStateOf(false) }
Surface(
selected = selected,
onClick = { selected = !selected },
) {
Text(text = if (selected) "Selected" else "Not Selected", textAlign = TextAlign.Center)
}
}
ToggleableSurfaceSample
@Preview
@Composable
fun ToggleableSurfaceSample() {
var checked by remember { mutableStateOf(false) }
Surface(
checked = checked,
onCheckedChange = { checked = !checked },
color =
if (checked) {
MaterialTheme.colorScheme.surfaceVariant
} else {
MaterialTheme.colorScheme.surface
}
) {
Text(text = if (checked) "ON" else "OFF", textAlign = TextAlign.Center)
}
}