Android compose constraintlayout examples
ConstraintLayout can help you place composables relative to others on the screen and is an alternative to using multiple Rows, Columns and Boxes. ConstraintLayout is useful when implementing larger layouts with more complicated alignment requirements.
ConstraintLayout dependency
implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0-rc01"
ConstraintLayout in Compose works with a DSL:
- References are created using createRefs() (or createRef()) and each composable in ConstraintLayout needs to have a reference associated.
- Constraints are provided using the constrainAs modifier which takes the reference as a parameter and lets you specify its constraints in the body lambda.
- Constraints are specified using linkTo or other helpful methods.
- parent is an existing reference that can be used to specify constraints towards the ConstraintLayout composable itself.
import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.material.Button import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.layoutId import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.ConstraintSet import androidx.constraintlayout.compose.Dimension import com.codelab.layouts.ui.LayoutsCodelabTheme @Composable fun ConstraintLayoutContent() { ConstraintLayout { val (button, text) = createRefs() Button( onClick = { /* Do something */ }, modifier = Modifier.constrainAs(button) { top.linkTo(parent.top, margin = 16.dp) } ) { Text("Button") } Text("Text", Modifier.constrainAs(text) { top.linkTo(button.bottom, margin = 16.dp) }) } } @Composable fun DecoupledConstraintLayout() { BoxWithConstraints { val constraints = if (maxWidth < maxHeight) { decoupledConstraints(margin = 16.dp) // Portrait constraints } else { decoupledConstraints(margin = 32.dp) // Landscape constraints } ConstraintLayout(constraints) { Button( onClick = { /* Do something */ }, modifier = Modifier.layoutId("button") ) { Text("Button") } Text("Text", Modifier.layoutId("text")) } } } private fun decoupledConstraints(margin: Dp): ConstraintSet { return ConstraintSet { val button = createRefFor("button") val text = createRefFor("text") constrain(button) { top.linkTo(parent.top, margin = margin) } constrain(text) { top.linkTo(button.bottom, margin) } } } @Composable fun ConstraintLayoutContentExample2() { ConstraintLayout { val (button1, button2, text) = createRefs() Button( onClick = { /* Do something */ }, modifier = Modifier.constrainAs(button1) { top.linkTo(parent.top, margin = 16.dp) } ) { Text("Button 1") } Text("Text", Modifier.constrainAs(text) { top.linkTo(button1.bottom, margin = 16.dp) centerAround(button1.end) }) val barrier = createEndBarrier(button1, text) Button( onClick = { /* Do something */ }, modifier = Modifier.constrainAs(button2) { top.linkTo(parent.top, margin = 16.dp) start.linkTo(barrier) } ) { Text("Button 2") } } } @Composable fun LargeConstraintLayout() { ConstraintLayout { val text = createRef() val guideline = createGuidelineFromStart(fraction = 0.5f) Text( "This is a very very very very very very very long text", Modifier.constrainAs(text) { linkTo(start = guideline, end = parent.end) width = Dimension.preferredWrapContent } ) } } @Preview @Composable fun ConstraintLayoutContentPreview() { LayoutsCodelabTheme { ConstraintLayoutContent() } } @Preview @Composable fun ConstraintLayoutContentExample2Preview() { LayoutsCodelabTheme { ConstraintLayoutContentExample2() } } @Preview @Composable fun LargeConstraintLayoutPreview() { LayoutsCodelabTheme { LargeConstraintLayout() } } @Preview @Composable fun DecoupledConstraintLayoutPreview() { LayoutsCodelabTheme { DecoupledConstraintLayout() } }
Reference:
https://github.com/googlecodelabs/android-compose-codelabs
Search within Codexpedia
Custom Search
Search the entire web
Custom Search
Related Posts