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

这篇具有很好参考价值的文章主要介绍了Jetpack Compose布局控件Column、Row、Box 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

compose row中居中显示,Android,android,Compose,Jetpack,布局控件,view

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

Compose 开发中,设计者将 View 的通用属性设置封装成接口类 Modifier 给开发者统一调用,比如设置 ViewBackgroundWidth / HeightPaddingClickable 等等,介绍布局控件之前先来简单了解 Modifier,后续会有专门的文章来详细讲解。

属性介绍

@Composable
fun 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 {
                
            }
    )
}
  • fillMaxWidth() / fillMaxHeight() 设置填充最大宽高,也可以用 fillMaxSize() 代替。
  • width() / height() 设置控件宽高,也可以用 size() 代替。
  • padding 设置控件的内边距
  • background() 设置背景
    • color:背景颜色
    • shape:设置裁剪(RoundedCornerShape(10.dp) 圆角 10dp)
  • clickable{} 设置点击监听

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

@Composable
fun SquareView() {
    ModifierTestView(
        modifier = Modifier
            .width(100.dp)
            .height(100.dp)
    )
}

@Composable
fun 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 垂直方向)

属性介绍

@Composable
inline fun Column(
    modifier: Modifier = Modifier,
    verticalArrangement: Arrangement.Vertical = Arrangement.Top,
    horizontalAlignment: Alignment.Horizontal = Alignment.Start,
    content: @Composable ColumnScope.() -> Unit
)
  • modifier:常用属性设定
  • verticalArrangement:垂直方向设定
  • horizontalAlignment:水平方向设定
  • content:添加布局内的 View

代码示例

@Composable
fun ColumnView() {
    Column(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.White),
        verticalArrangement = Arrangement.Top
    ) {
        Text(text = "垂直排列 0")
        Text(text = "垂直排列 1")
        Text(text = "垂直排列 2")
        Text(text = "垂直排列 3")
    }
}

Column 子 View 方向设定

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

  • verticalArrangement(垂直方向设定)
    1. .Top:子 View 居于 Column 垂直方向居上
    2. .Bottom:子 View 居于 Column 垂直方向居下
    3. .Center:子 View 居于 Column 垂直方向居中
    4. .SpaceEvenly:子 View 平均分配 Column 垂直(高度)
    5. .SpaceAround:子 View 平均分配 Column 垂直(高度),但是头部和底部 子 View 基于 Column 头部和底部的边距是平分高度的一半。
    6. .SpaceBetween:子 View 平均分配 Column 垂直(高度),头部和底部子 View 贴着 Column头部底部,没有边距。
  • horizontalAlignment(水平方向设定)
    1. .Start:子 View 居于 Column 开始绘制的边界(水平方向左对齐)
    2. .End:子 View 居于 Column 结束绘制的边界(水平方向右对齐)
    3. .CenterHorizontally:子 View 居于 Column 水平方向居中

看示例图更好理解

compose row中居中显示,Android,android,Compose,Jetpack,布局控件,view

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

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

属性介绍

@Composable
inline fun Row(
    modifier: Modifier = Modifier,
    horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
    verticalAlignment: Alignment.Vertical = Alignment.Top,
    content: @Composable RowScope.() -> Unit
)
  • modifier:常用属性设定
  • horizontalArrangement:水平方向设定
  • verticalAlignment:垂直方向设定
  • content:添加布局内的 View

代码示例

@Composable
fun RowView() {
    Row(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.White),
        verticalAlignment = Alignment.Top
    ) {
        Text(text = "水平排列 0")
        Text(text = "水平排列 1")
        Text(text = "水平排列 2")
        Text(text = "水平排列 3")
    }
}

Row 子 View 方向设定

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

  • horizontalArrangement(水平方向设定)

    1. .Start:子 View 居于 Row 开始绘制的边界(水平方向左对齐)
    2. .End:子 View 居于 Row 结束绘制的边界(水平方向右对齐)
    3. .Center:子 View 居于 Row 水平方向居中
    4. .SpaceEvenly:子 View 平均分配 Row 水平方向(宽度)
    5. .SpaceAround:子 View 平均分配 Row 水平方向(宽度),但是头部和尾部子 View 基于 Row 水平方向左边右边的边距是平分水平方向宽距的一半。
    6. .SpaceBetween:子 View 平均分配 Row 水平方向(宽度),头部和底部子 View 贴着 Row 水平方向左侧和右侧,没有边距。
  • verticalAlignment(垂直方向设定)

    1. .Top:子 View 居于 Row 垂直方向上方对齐
    2. .Bottom:子 View 居于 Row 垂直方向下方对齐
    3. .CenterVertically:子 View 居于 Row 垂直方向居中

Column / Row 设置 Weight 属性

设置 Weight 属性需要在 Column / Row 的子 View 中调用,使用 Modifie.weight()(与 LinearLayout 子 View 设置 weight 类似)。

属性介绍

@Stable
fun Modifier.weight(
    weight: Float,
    fill: Boolean = true
): Modifier
  • weight:设置当前子 View 在 Column / Row 内垂直方向 / 水平方向大小的权重
  • fill:是否将分配的权重大小填充满,默认为 true

代码示例

@Composable
fun 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
)
  • state:设置滚动位置和滚动位置监听
  • enabled:是否开启滚动设置,默认开启(true)
  • flingBehavior:可自定义滑动速度 延时 等,默认是 DefaultFlingBehavior() 函数,在 androidx.compose.foundation.gestures.scrollable 下,实现了 ScrollScope.perFormFling 方法,可用于参考做自定义滑动属性。
  • reverseScrolling:反向滑动

代码示例

@Composable
fun 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)

属性介绍

@Composable
inline fun Box(
   modifier: Modifier = Modifier,
   contentAlignment: Alignment = Alignment.TopStart,
   propagateMinConstraints: Boolean = false,
   content: @Composable BoxScope.() -> Unit
)
  • modifier:常用属性设定
  • contentAlignment:子 View 位置设定
  • propagateMinConstraintsBox 没有设置固定尺寸并且设置了最小尺寸,是否将最小尺寸值设置给子 View,默认为 false
  • content:添加布局内的 View

代码示例

@Composable
fun 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 子 View 方向设定

Box 方向设定使用 Alignment 设定

  • .TopStart:子 View 居于 Box 左上边界(左上角)
  • .TopCenter:子 View 居于 Box 上边界并且水平居中
  • .BootomStart:子 View 居于 Box 左和底部边界(左下角)
  • .BootomCenter:子 View 居于 Box 底部边界并且水平居中
  • .CenterStart:子 View 居于 Box 左侧并且垂直居中
  • .Center:子 View 居中
  • .CenterEnd:子 View 居于 Box 右侧并且垂直居中

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

View 可在 BoxWithConstraints 控件内获取到约束属性

@Composable
fun 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 有顺序调用的巧妙设计,下面举个栗子就明白了。

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

compose row中居中显示,Android,android,Compose,Jetpack,布局控件,view文章来源地址https://www.toymoban.com/news/detail-770161.html

  • Text 1:设置宽高大小 -- 设置 padding -- 设置背景颜色,如图效果背景是在 padding 后绘制的。
  • Text 2:设置 padding -- 设置宽高大小 -- 设置背景颜色,首先的 padding 设置和 XMLMargin 设定效果一样(设置外边距)。
  • Text 3:设置宽高大小 -- 设置背景颜色 -- 设置 padding,设置内边距。

到了这里,关于Jetpack Compose布局控件Column、Row、Box 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android——jetpack Compose布局居中,margin,padding,文字居中

    需要注意\\\"Arrangement\\\"和\\\"Alignment\\\"的区别 直接在控件中进行居中展示 Text控件中的modifier属性中有两个padding,第一个padding就属于margin,第二个就是对应原来写法的内padding,需要margin的话需要写在最前面 在 Text 控件中有对应的宽高背景,文字需要居中,有对应的TextAlign属性使用,但是属性

    2024年02月16日
    浏览(49)
  • compose--初入compose、资源获取、标准控件与布局

    compose正式发布已经一年多了,越来越多的开发人员选择使用它, 声明式UI 也是未来的一个主流趋势,本人也是一年前学习后,并没有真正的使用,所以本着边学习,边分享的心态,准备写个compose系列的文章 首先compose目前只支持 kotlin ,基于google对移动端的鸿图,未来应该也

    2024年02月09日
    浏览(40)
  • 详解Jetpack Compose中的Modifier修饰符

            本文将会介绍Jetpack Compose中的Modifier。在谷歌官方文档中它的描述是这么一句话:Modifier元素是一个 有序、不可变 的集合,它可以往Jetpack Compose UI元素中添加修饰或者各种行为。例如,背景、填充和单击事件监听器装饰或添加行为到文本或按钮。         Mod

    2024年02月06日
    浏览(41)
  • Jetpack Compose 深入探索系列四: Compose UI

    通过 Compose runtime 集成 UI Compose UI 是一个 Kotlin 多平台框架。它提供了通过可组合函数发出 UI 的构建块和机制。除此之外,这个库还包括 Android 和 Desktop 源代码,为 Android 和 Desktop 提供集成层。 JetBrains积极维护Desktop代码库,而Google维护Android和通用代码库。Android和Desktop源代码

    2024年02月12日
    浏览(48)
  • Jetpack Compose 学习汇总

    关于 Jetpack Compose 的学习本想只是简单的快速学习一下,结果万万没想到,竟然一下子折腾了好几个月。。。 下面将之前记录的 Jetpack Compose 相关的学习博文进行一个汇总链接整理,方便我以后自己查阅,也希望能帮到一些有正在学习 Compose 的道友。 Jetpack Compose 中的基础组件

    2024年02月12日
    浏览(41)
  • Jetpack Compose(6)——动画

    目录 一、低级别动画 API 1.1 animate*AsState 1.2 Animatable 1.3 Transition 动画 1.3.1 updateTransition 1.3.2 createChildTransition 1.3.3 封装并复用 Transition 动画 1.4 remeberInfiniteTransition —— 无限循环的 transition 动画 1.5 小结 二、Android Studio 对 Compose 动画调试的支持 三、AnimationSpec 动画规格 3.1 Sprin

    2024年04月26日
    浏览(33)
  • Jetpack Compose(4)——重组

    目录 一、状态变化 1.1 状态变化是什么 1.2 mutableStateListOf 和 mutableStateMapOf 二、重组的特性 2.1 Composable 重组是智能的 2.2 Composable 会以任意顺序执行 2.3 Composable 会并发执行 2.4 Composable 会反复执行 2.5 Composable 的执行是“乐观”的 三、重组范围 四、参数类型的稳定性 4.1 稳定和不

    2024年04月08日
    浏览(39)
  • Jetpack compose实现MVI

    MVI(Model-View-Intent)是一种前端架构模式,其目标是使状态管理更具可预测性,便于开发和调试。它将应用程序视为一个函数,该函数接受一系列的意图(Intent)作为输入,然后返回一个新的状态作为输出。在 Jetpack Compose 中,你可以使用 Kotlin Flow 和 State 来实现 MVI。 下面是

    2024年02月16日
    浏览(32)
  • Jetpack Compose(3) —— 状态管理

    上一篇文章拿 TextField 组件举例时,提到了 State ,即状态。本篇文章,即讲解 State 的相关改概念。 与其它声明式 UI 框架一样,Compose 的职责非常单纯,仅作为对数据状态的反应。如果数据状态没有改变,则 UI 永远不会自行改变。在 Compose 中,每一个组件都是一个被 @Composa

    2024年03月13日
    浏览(46)
  • Jetpack Compose之选择器

    选择器主要是指Checkbox复选框,单选开关Switch,滑杆组件Slider等用于提供给用户选择一些值和程序交互的组件,比如像复选框Checkbox,可以让用户选择一个或者多个选项,它可以将一个选项打开或者是关闭,通常用来做线上调查问卷或者是模拟考试的场景程序中,再比如滑杆组

    2023年04月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包