JetPack Compose系列之标准布局

165 阅读2分钟

compose-roadmap.svg

概述

Android XML中的常用布局有LinearLayoutRelativeLayoutFrameLayoutConstraintLayout。 相对应的在 Compose 的布局有ColumnRowBoxConstraintLayout,Compose 中的全新布局控件,能实现高性能更容易实现自定义布局

注意:使用 Android View 系统时,在嵌套某些 View(如 RelativeLayout)时,可能会出现一些性能问题。由于 Compose 可以避免多次测量,因此可以根据需要进行深层次嵌套,而不会影响性能。

在Compose中提供了三种标准的布局元素:ColumnRowBox

image.png

Column(纵向布局)

属性介绍

@Composable
inline fun Column(
    //常用属性设置
    modifier: Modifier = Modifier,
    //纵向属性设置
    verticalArrangement: Arrangement.Vertical = Arrangement.Top,
    //横向属性设置
    horizontalAlignment: Alignment.Horizontal = Alignment.Start,
    //布局内的子组件
    content: @Composable ColumnScope.() -> Unit
)

纵向使用Arrangement设置:

  • Arrangement.Top:子view居上显示
  • Arrangement.Center:子view居中显示
  • Arrangement.Bottom:子view居下显示
  • Arrangement.SpaceEvenly:子view均分Column高度显示, 可结合下图区分其效果
  • Arrangement.SpaceAround:子view均分Column高度显示, 可结合下图区分其效果
  • Arrangement.SpaceBetween:子view均分Column高度显示, 头部和底部子view贴边显示

横向使用Alignment设置:

  • Alignment.Start:子view水平方向居左显示
  • Alignment.CenterHorizontally:子view水平方向居中显示
  • Alignment.End:子view水平方向居右侧显示

图解 (认真观察理解其区别):

动图

Row(横向布局)

属性介绍

@Composable
@Composable
inline fun Row(
  //常用属性设置
  modifier: Modifier = Modifier,
  //横向属性设置
  horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
  //纵向属性设置
  verticalAlignment: Alignment.Vertical = Alignment.Top,
  //布局内的子组件
  content: @Composable RowScope.() -> Unit
)

横向使用Arrangement设置:

  • Arrangement.Start:子view水平居左显示
  • Arrangement.Center:子view水平居中显示
  • Arrangement.End:子view水平居右显示
  • Arrangement.SpaceEvenly:子view均分Row水平宽度显示, 可结合下图区分其效果
  • Arrangement.SpaceAround:子view均分Row水平宽度显示, 可结合下图区分其效果
  • Arrangement.SpaceBetween:子view均分Row水平宽度显示, 左侧和右侧子view贴边显示

纵向使用Alignment设置:

  • Alignment.Top:子view垂直方向居上显示
  • Alignment.CenterHorizontally:子view垂直方向居中显示
  • Alignment.Bottom:子view垂直方向居下显示

图解 (认真观察理解其区别):

动图

Box 布局

属性介绍

@Composable
inline fun Box(
    modifier: Modifier = Modifier,
    contentAlignment: Alignment = Alignment.TopStart,
    propagateMinConstraints: Boolean = false,
    content: @Composable BoxScope.() -> Unit
)

使用Alignment设置:

  • Alignment.TopStart:默认设置属性
  • Alignment.TopCenter
  • Alignment.TopEnd
  • Alignment.CenterStart
  • Alignment.Center
  • Alignment.CenterEnd
  • Alignment.BottomStart
  • Alignment.BottomCenter
  • Alignment.BottomEnd

可修改contentAlignment = Alignment.TopStart查看显示效果

@Composable
private fun BoxContaier() {
    Column(modifier = Modifier.fillMaxSize()) {
        Box(
            modifier = Modifier.background(color = Color(R.color.purple_500)),
            contentAlignment = Alignment.TopStart,
        ) {
            TextButton(
                onClick = { /*TODO*/ },
                modifier = Modifier
                    .padding(8.dp)
                    .clip(RoundedCornerShape(10.dp))
                    .width(80.dp)
                    .height(80.dp)
                    .background(color = Color.Green),
            ) {
                Text(text = "One")
            }
            TextButton(
                onClick = { /*TODO*/ },
                modifier = Modifier
                    .padding(60.dp)
                    .clip(RoundedCornerShape(10.dp))
                    .width(80.dp)
                    .height(80.dp)
                    .background(color = Color.White),
            ) {
                Text(text = "Two")
            }

            TextButton(
                onClick = { /*TODO*/ },
                modifier = Modifier
                    .padding(120.dp)
                    .clip(RoundedCornerShape(10.dp))
                    .width(80.dp)
                    .height(80.dp)
                    .background(color = Color.Magenta),
            ) {
                Text(text = "Three")
            }
        }
    }
}

默认效果如下:

image.png

知行合一, 最好能按上图效果练习10遍以上, 方能形成手中利剑, 所向披靡。