Compose学习与总结一:compose里的layout

工作很多年了,没觉得自己多牛,所以也一直没有写点啥的想法,最近回顾一下发现也学了知识。写些博客记录一下,既是传播也是总结。先从android 的compose UI 框架开始吧。

compose 是谷歌新推出来的android的UI框架,有着更贴合mvvm模式,更便捷,更符合前端语言等等优势。但是同时他也和原来的xml布局大有不同,设计思想,运行机制也很不一样。

我是个实用主义者,所以是从通俗易懂,先掌握后精通的角度,开始书写。其实我一直觉得具体的复杂运行机制直接看官网就行了。下面开始由易到难来进行总结。

首先按原有android布局逻辑来说肯定是先viewgroup 后view来掌握。

所以首先推荐先学习 compose.foundation.layout 这个包。

里面包括了我们compose中一直伴随着我们的,也最重要的API Modifier 修饰符。

Modifier 他在我们所有compose 组件中都可以作为一个属性,传给组件。他有非常多可以设置属性的方法,几乎包含了所有布局中能用到的。最开始这里我们主要掌握以下这些: width() heigh() fillMaxHeigh() fillMaxWidth() fillMaxSize() 设置宽高和设置为最大宽高。requireWidth() requireHeigh() 声明内容的宽高 requireSize() 声明内容的大小

absoluteOffset() 绝对偏移量(可以是px也可以是dp)absoltePadding()绝对边距量,offset() 相对偏移量。

widthIn() heightIn() requireWidthIn() requireHeightIn() 声明在指定范围内的宽高。

以上就是我们布局常用的方法,还有很多事件方法也有如clickable 点击事件 draggable 拖动事件,一直从最初级到最高的各种动画和自定义view都会使用到Modifier,用到哪学到哪,或者对着谷歌官网刷一遍有个总体的印象也很不错。

https://developer.android.google.cn/reference/kotlin/androidx/compose/foundation/package-summary#extension-functions-summary

下面我们介绍一些常用最大的包裹内容的组件。

Box 盒子。看名字就知道就是个空盒子用来占据空间,包裹控件的。如果你会前端理解成div 也没有多大问题,对比android原来的用法看成一个单纯的Framelayout,对于这个空盒子我们可以通过Modifer 修饰符来设置属性,比如宽高,背景,边框,内容对齐的方式等等。下面是一个综合用例。

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    Box(modifier = Modifier
        .fillMaxWidth()
        .height(300.dp)
        .background(color = Color.Green, shape = RoundedCornerShape(20.dp))
    , contentAlignment = Alignment.Center
    ) {
        Text(text = "我是一个内容居中的盒子")
    }
}

效果如下:

Surface 平面,也是个容器和Box一样 ,但是他是平面控件的概念,可以理解为一个空的布局。但是并不是意味着Surface里面的控件不会重叠!!!

这里是比较难解释的地方,因为Box和Surface相互可以实现一模一样的功能。我是从语义化,和试用功能来理解,决定他们的使用方式。

  1. 从布局上来说,大控件的用Surface ,小的控件用Box,谷歌默认生成的根布局就是Surface
  2. 从语义化来说,Box用来创建一个矩形的区域,Surface用来创建一块可交互的页面。

所以需要交互的地方优先使用Surface。

  1. 从谷歌官方推荐上来讲需要实现层层叠叠效果的优先使用Box。

这里不需要过多的纠结,不熟练时只用一个也不会影响到布局书写。

然后就是我们的Spacer 控件了,这个非常好理解,就是个留白,空白控件用来快速实现原来的xml布局里面的margin效果。

接着就是我们常用的Column和Row 纵向布局和横向布局。首先来说Column,你可以理解为原来垂直方向线性布局,每一个独立的子控件都会占据一行。但是其多了两个属性verticalArrangement 和 horizontalAlignment 来决定其纵向和横向布局的对齐方式。Row同理,理解为横向的线性布局,其他同理。以下是演示代码和效果。

Column:

Column(modifier = Modifier
    .fillMaxWidth()
    .height(300.dp)
    .background(color = Color.Green, shape = RoundedCornerShape(20.dp)),
    verticalArrangement=Arrangement.Center,
    horizontalAlignment =Alignment.End
) {
    Text(text = "我是一个内容居中的盒子")
    Text(text = "我是一个内容居中的盒子2")
}

Row :

Row(modifier = Modifier
    .fillMaxWidth()
    .height(300.dp)
    .background(color = Color.Green, shape = RoundedCornerShape(20.dp)),
    horizontalArrangement=Arrangement.Center,
    verticalAlignment =Alignment.Bottom
) {
    Text(text = "我是一个内容居中的盒子")
    Text(text = "我是一个内容居中的盒子2")
}

以上就是我们主要常用的layout容器内容了,是不是很简单。剩下的就是优先学习compose_material_2和compose_material_3 包里面封装好的脚手架(官方封装好了各种功能的容器)了,再学习里面官方具体封装好了的实用功能控件了。由大到小是我们的学习顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值