Jetpack Compose - Row、Column

Compose系列文章,请点原文阅读。原文,是时候学习Compose了!

0、介绍

首先大致了解下这两个布局:

  • Row :水平布局,官方介绍如下

可以组合的布局,会将其子级 横向 进行放置。
如果需要 竖向 进行放置,请参考Column。
如果需要子级可以 横向滚动 ,请参考ScrollableRow。
如果需要只展示当前可见项 的 横向滚动列表请参考 LazyRow。

  • Column

可以组合的布局,会将其子级 竖向 进行放置。
如果需要 横向 进行放置,请参考Row。
如果需要子级可以 横向滚动 ,请参考ScrollableColumn。
如果需要只展示当前可见项 的 横向滚动列表请参考 LazyColumn。

所以根据官方介绍我们可以明确知道,Row和Column就是我们之前的LinearLayout,只不过官方细分了,直接分出来两个布局。 而且这两个布局没有滚动效果,当内容过长的时候会超出屏幕而无法看到内容项。

再多说一点,其实要想实现ScrollView的效果,就需要使用ScrollableXXX布局。要想实现RecyclerView的效果,就需要使用LazyXXX布局。

1、属性一览

【目前基于alpha08版本】请看Row布局支持的函数:

@Composable inline fun Row(
    modifier: Modifier = Modifier, 
    horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, 
    verticalAlignment: Alignment.Vertical = Alignment.Top, 
    content: RowScope.() -> Unit
): Unit

属性参数含义:

参数含义
modifier: Modifier = Modifier应用于布局的修饰符
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start布局子级的 水平 放置方式,默认从布局开始往布局结束方向放置
verticalAlignment: Alignment.Vertical = Alignment.Top布局子级的 垂直 对其方式,默认从布局顶部对齐

再来看下Column布局的函数:

@Composable inline fun Column(
    modifier: Modifier = Modifier, 
    verticalArrangement: Arrangement.Vertical = Arrangement.Top, 
    horizontalAlignment: Alignment.Horizontal = Alignment.Start, 
    content: ColumnScope.() -> Unit
): Unit

属性参数含义:

参数含义
modifier: Modifier = Modifier应用于布局的修饰符
verticalArrangement: Arrangement.Vertical = Arrangement.Top布局子级的 竖直 放置方式,默认从布局顶部往布局底部方向放置
horizontalAlignment: Alignment.Horizontal = Alignment.Start布局子级的 水平直 对其方式,默认从布局开始对齐

总结来说就是:
水平布局从横向开始往结束方向进行布局,然后其子级默认顶部对齐;
竖直布局从顶部开始往底部进行布局,然后其子级默认开始方向对其(为什么是Start和End而不是Left和Right,因为国际化的问题,我们国家的阅读方式是从左到右,但是有的国家却是从右到左,所以Left和Right这个概念就不适合了,因此需要使用Start和End概念)

2、使用示例

这两个布局属性基本类似,所以我们只使用Row布局来进行演示,我们在Row布局中,放置了两个简单的Box,布局,第一个是宽高200的红色框,第二个是宽高100的黄色框,代码如下:

@Composable
fun RowDemo() {
    Row(
        modifier = Modifier.fillMaxSize()
    ) {
        Box(
            Modifier
                .width(200.dp)
                .height(200.dp)
                .background(Color.Red)
        )
        Box(
            Modifier
                .width(100.dp)
                .height(100.dp)
                .background(Color.Yellow)
        )
    }
}

实现效果如下所示:
在这里插入图片描述
然后设置Row的竖直方向对齐方式为竖直居中对齐: verticalAlignment = Alignment.CenterVertically,显示效果如下:
在这里插入图片描述
然后设置Row的水平布局方向为从 结束到开始 进行布局:
horizontalArrangement = Arrangement.End,再来看显示效果:
在这里插入图片描述从之前的左侧贴着屏幕,到现在的右侧贴着屏幕。

还剩下一个重要的概念- 权重 ,什么意思呢,还拿上文的红黄框做讲解,Row的布局我们定义它是填充整个屏幕的,红黄框是横向排列的,如果我们不指定红黄框的宽度,而是指定红黄框所占的比重是1:1,那么横向上他们将各占Row布局宽度的一半,也就是说各占屏幕的一半,代码如下所示:

@Composable
fun RowDemo() {
    Row(
        modifier = Modifier.fillMaxSize(),
    ) {
        Box(
            Modifier
                .height(200.dp)
                .weight(1f)
                .background(Color.Red)
        )
        Box(
            Modifier
                .height(100.dp)
                .weight(1f)
                .background(Color.Yellow)
        )
    }
}

效果如下所示:
在这里插入图片描述

3、版本更新

  • alpha 11
    在该版本,取消了ScrollableRow和ScrollableColumn函数,取而代之的是使用Modifier的相关属性来实现行或者列中超出内容的滚动效果。
    如下所示代码,当子级内容总宽度超过其最大宽度时,可以横向滚动查看超出的部分:
	@Composable
	fun RowDemo() {
	    val scrollState = rememberScrollState()
	    Row(
	        modifier = Modifier
	            .fillMaxSize()
	            .horizontalScroll(scrollState),
	    ) {
	    }
    }

4、未解决问题

关于水平竖直的布局基本使用方式也就这些了,剩下的基本就是宽度或者高度超出屏幕的问题,需要使用ScrollableRow或者ScrollableColumn布局了,这个我们下文讲解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值