本篇文章介绍 Compose 的布局控件 Column、Row、Box,在 Android XML 模式开发中,常用的布局控件有 LinearLayout、RelativeLayout、FrameLayout 以及 ConstraintLa
本篇文章介绍 Compose 的布局控件 Column、Row、Box,在 Android XML 模式开发中,常用的布局控件有 LinearLayout、RelativeLayout、FrameLayout 以及 ConstraintLayout, Compose 没有延用之前的布局设计,而是提供了全新的布局控件,不仅实现了 XML 模式的相关功能并且更加灵活好用。
Compose 开发中,设计者将 View 的通用属性设置封装成接口类 Modifier 给开发者统一调用,比如设置 View 的 Background、Width / Height、Padding、Clickable 等等,介绍布局控件之前先来简单了解 Modifier,后续会有专门的文章来详细讲解。
@Composablefun ModifierTestView() { Text( text = "Hello Compose!", modifier = Modifier .fillMaxWidth() .fillMaxHeight() .width(100.dp) .height(100.dp) .padding() .background( color = colorResource(id = R.color.black), shape = RoundedCornerShape(10.dp) ) .clickable {} )}
@Composablefun SquareView() { ModifierTestView( modifier = Modifier .width(100.dp) .height(100.dp) )}@Composablefun ModifierTestView(modifier: Modifier) { Text( text = "Hello Compose!", modifier = Modifier .width(100.dp) .height(100.dp) .padding() .background(colorResource(id = R.color.black)) .clickable { } )}
@Composableinline fun Column( modifier: Modifier = Modifier, verticalArrangement: Arrangement.Vertical = Arrangement.Top, horizontalAlignment: Alignment.Horizontal = Alignment.Start, content: @Composable ColumnScope.() -> Unit)
@Composablefun ColumnView() { Column( modifier = Modifier .fillMaxSize() .background(Color.White), verticalArrangement = Arrangement.Top ) { Text(text = "垂直排列 0") Text(text = "垂直排列 1") Text(text = "垂直排列 2") Text(text = "垂直排列 3") }}
Column 垂直方向使用 Arrangement 设置,水平方向使用 Alignment 设置。
EqualWeight 在正式版发布后,使用了子 View .weight() 方式代替,下面会详细介绍。
@Composableinline fun Row( modifier: Modifier = Modifier, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, verticalAlignment: Alignment.Vertical = Alignment.Top, content: @Composable RowScope.() -> Unit)
@Composablefun RowView() { Row( modifier = Modifier .fillMaxSize() .background(Color.White), verticalAlignment = Alignment.Top ) { Text(text = "水平排列 0") Text(text = "水平排列 1") Text(text = "水平排列 2") Text(text = "水平排列 3") }}
Row 水平方向使用 Arrangement 设置,垂直方向使用 Alignment 设置。
horizontalArrangement(水平方向设定)
verticalAlignment(垂直方向设定)
设置 Weight 属性需要在 Column / Row 的子 View 中调用,使用 Modifie.weight()(与 LinearLayout 子 View 设置 weight 类似)。
@Stablefun Modifier.weight( weight: Float, fill: Boolean = true): Modifier
@Composablefun ColumnView() { Column( modifier = Modifier .fillMaxSize() .background(Color.White) ) { Text( text = "竖向排列 0", Modifier .weight(1f) .background(Color.LightGray) ) Text( text = "竖向排列 1", Modifier .weight(0.5f) .background(Color.Cyan) ) Text(text = "竖向排列 2", Modifier.background(Color.Red)) Text(text = "竖向排列 3", Modifier.background(Color.Magenta)) }}
添加滚动需要设置 Column / Row 的 Modifier.verticalScroll / Modifier.horizontalScroll
fun Modifier.verticalScroll( state: ScrollState, enabled: Boolean = true, flingBehavior: FlingBehavior? = null, reverseScrolling: Boolean = false)
@Composablefun ColumnScrollView() { val scrollLocation = rememberScrollState(300) //设置初始滑动位置 Log.i("====Column Scroll====", "Location:${scrollLocation.value}") Column( modifier = Modifier .height(200.dp) .fillMaxWidth() .background(Color.White) .verticalScroll(scrollLocation) ) { for (i in 0..20) { Text( text = "竖向排列 $i", modifier = Modifier.height(50.dp) ) } }}
@Composableinline fun Box( modifier: Modifier = Modifier, contentAlignment: Alignment = Alignment.TopStart, propagateMinConstraints: Boolean = false, content: @Composable BoxScope.() -> Unit)
@Composablefun BoxView() { Box( modifier = Modifier .fillMaxSize() .background(Color.White), contentAlignment = Alignment.Center ) { Text( text = "Text 1", modifier = Modifier .size(300.dp) .background(Color.Blue) ) Text( text = "Text 2", modifier = Modifier .size(200.dp) .background(Color.Red) ) Text( text = "Text 3", modifier = Modifier .size(100.dp) .background(Color.DarkGray) ) }}
Box 方向设定使用 Alignment 设定
子 View 可在 BoxWithConstraints 控件内获取到约束属性
@Composablefun BoxWithConstraintsView() { BoxWithConstraints( modifier = Modifier .fillMaxSize() .background(Color.White) ) { this.constraints this.maxHeight this.minHeight this.maxWidth this.minWidth Text( text = "Text 1", Modifier .width(this.minWidth) .height(this.minHeight) ) }}
在 Android XML 开发中,经常用到 Margin(外边距)\ Padding(内边距)属性,但是在 Compose 中却发现只有 Modifier.padding(),这是因为 Modifier 有顺序调用的巧妙设计,下面举个栗子就明白了。
@Composablefun ColumnView() { Column( modifier = Modifier .fillMaxSize() .background(Color.White) ) { Text( modifier = Modifier .size(100.dp) .padding(start = 20.dp) .background(Color.Magenta), text = "Text 1" ) Text( modifier = Modifier .padding(start = 20.dp) .size(100.dp) .background(Color.Cyan), text = "Text 2" ) Text( modifier = Modifier .size(100.dp) .background(Color.LightGray) .padding(start = 20.dp), text = "Text 3" ) }}
来源地址:https://blog.csdn.net/qq_39312146/article/details/129942188
--结束END--
本文标题: Jetpack Compose布局控件Column、Row、Box 详解
本文链接: https://lsjlt.com/news/388894.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0