文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Jetpack Compose布局控件Column、Row、Box 详解

2023-09-01 15:50

关注

本篇文章介绍 Compose 的布局控件 ColumnRowBox,在 Android XML 模式开发中,常用的布局控件有 LinearLayoutRelativeLayoutFrameLayout 以及 ConstraintLayout, Compose 没有延用之前的布局设计,而是提供了全新的布局控件,不仅实现了 XML 模式的相关功能并且更加灵活好用。

先了解 Modifier:(View 的常用属性设定)

Compose 开发中,设计者将 View 的通用属性设置封装成接口类 Modifier 给开发者统一调用,比如设置 ViewBackgroundWidth / HeightPaddingClickable 等等,介绍布局控件之前先来简单了解 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 {}    )}

Modifier 作为参数传递,统一设定

@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 {            }    )}

Column 垂直布局:(LinearLayout 垂直方向)

属性介绍

@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")    }}

ColumnView 方向设定

Column 垂直方向使用 Arrangement 设置,水平方向使用 Alignment 设置。

看示例图更好理解

EqualWeight 在正式版发布后,使用了子 View .weight() 方式代替,下面会详细介绍。

Row 水平布局:(LinearLayout 水平方向)

属性介绍

@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")    }}

RowView 方向设定

Row 水平方向使用 Arrangement 设置,垂直方向使用 Alignment 设置。

Column / Row 设置 Weight 属性

设置 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 添加滚动

添加滚动需要设置 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)            )        }    }}

Box :(FrameLayoutr)

属性介绍

@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)        )    }}

BoxView 方向设定

Box 方向设定使用 Alignment 设定

BoxWithConstraints(子 View 可获取 Box 的约束属性)

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)        )    }}

Compose 为什么没有 Margin 属性?

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯