Compose Column控件讲解并且实现一个淘宝商品item的效果

简介: Compose Column控件讲解并且实现一个淘宝商品item的效果

前情提要


本篇文章主要对 Compose 中的 Column 进行使用解析,文章结束会使用 Column 和 Row 配合实现一个淘宝商品 Item 的效果,

最终效果预览:

image.png

如果您对 Column 的用法比较娴熟,可以直接看最后一节的内容


Column 简单说明


Column 对应于我们开发中的 LinearLayout.vertical,可以垂直的摆放内部控件

因为 Row 和 Column 是想通的,只不过 Column 是垂直方向布局的,而 Row 是水平方向布局。所以讲完了 Column 你只需要把例子代码中的 Column 换成 Row 就可以自行查看 Row 的效果了


Column 参数介绍


modifier

用来定义 Column 的各种属性,比如可以定义宽度、高度、背景等

  1. 示例代码
    设置 modifier 的时候可以链式调用
@Composable
fun DefaultPreview() {
    Column(modifier = Modifier
        .width(300.dp)
        .height(200.dp)
        .background(color = Color.Green)) {
    }
}
复制代码


  1. 实现效果

展示了一个绿色填充的矩形

image.png


verticalArrangement

实现内部元素的竖直对齐效果

关于 verticalArrangement 我们的示例代码如下

后面介绍每种效果的时候会更改 verticalArrangement 的值进行展示

Row() {
        Spacer(modifier = Modifier.width(100.dp))
        Column(
            modifier = Modifier
                .width(50.dp)
                .height(200.dp)
                .background(color = Color.Green),
//            verticalArrangement = Arrangement.SpaceAround
        ) {
            Image(modifier = Modifier.size(20.dp),painter = painterResource(id = R.drawable.apple), contentDescription = null)
            Image(modifier = Modifier.size(20.dp),painter = painterResource(id = R.drawable.apple), contentDescription = null)
            Image(modifier = Modifier.size(20.dp),painter = painterResource(id = R.drawable.apple), contentDescription = null)
            Image(modifier = Modifier.size(20.dp),painter = painterResource(id = R.drawable.apple), contentDescription = null)
        }
    }
复制代码


不设置该属性的效果
  1. 效果
    image.png
  2. 结论
    不设置该属性的时候,内部元素贴着顶部紧凑排列


Arrangement.Center
  1. 效果

image.png

  1. 结论
    所有元素垂直居中,紧凑排列

Arrangement.SpaceBetween
  1. 效果

image.png

  1. 结论
    元素之间均分空间,与顶部和底部之间无间距


SpaceAround 效果
  1. 效果

image.png

  1. 结论
    内部元素等分空间,并且顶部和底部留间距(顶部元素距离顶部的距离和底部元素距离底部的距离与元素等分的长度不一致)


Arrangement.SpaceEvenly
  1. 效果

image.png

  1. 结论
    所有元素均分空间(顶部元素距离顶部的距离和底部元素距离底部的距离与元素等分的长度一致)


Arrangement.Bottom
  1. 效果

image.png

  1. 结论
    所有元素靠近底部,紧凑排列


Arrangement.spacedBy(*.dp)

可以设置元素间的等分距离

比如我们设置 20dp,Arrangement.spacedBy(20.dp)

  1. 效果

image.png

  1. 结论

元素之间距离为 20dp,靠近顶部排列


horizontalAlignment

实现 Column 的水平约束


Alignment.Start 居开始的位置对齐
  1. 效果

image.png

  1. 结论
    当前模拟器 Start 就是 Right,所以内部元素居左侧对齐


Alignment.CenterHorizontally 水平居中
  1. 效果
    image.png
  2. 结论
    内部元素水平居中对齐


Alignment.End
  1. 效果

image.png

  1. 结论
    当前模拟器 End 就是 Left,所以内部元素居右侧对齐

content

关于这个属性,注释中都没写他我也就先不研究了

image.png


使用 Column 实现淘宝商品 item 布局


  1. 本例中目标效果图如下

image.png


  1. 代码
@Composable
fun DefaultPreview2() {
    Row(
        modifier = Modifier.fillMaxSize(1f).background(color= Color.Gray),
        verticalAlignment = Alignment.CenterVertically,
        horizontalArrangement = Arrangement.Center
    ) {
        Column(
            modifier = Modifier
                .width(200.dp)
                .background(color = Color.White)
                .padding(all = 10.dp)
        ) {
            Image(
                painter = painterResource(id = R.drawable.apple),
                contentDescription = null,
                modifier = Modifier.size(180.dp).clip(RoundedCornerShape(10.dp))
            )
            Text(
                text = "当天发,不要钱",
                fontSize = 20.sp,
                style = TextStyle(fontWeight = FontWeight.Bold),
                modifier = Modifier.padding(vertical = 2.dp)
            )
            Row(
                modifier = Modifier.padding(vertical = 2.dp),
                verticalAlignment = Alignment.CenterVertically
            ) {
                Text(
                    text = "¥说了不要钱",
                    fontSize = 14.sp,
                    color = Color(0xff9f8722)
                )
                Text(text = "23人免费拿", fontSize = 12.sp)
            }
            Row(
                modifier = Modifier
                    .width(200.dp)
                    .fillMaxWidth()
                    .padding(vertical = 2.dp),
                verticalAlignment = Alignment.CenterVertically
            ) {
                Text(text = "不要钱")
                Spacer(modifier = Modifier.weight(1f))//通过设置weight让Spacer把Row撑开,实现后面的图片居右对齐的效果
                Image(
                    painter = painterResource(id = android.R.drawable.btn_star_big_on),
                    contentDescription = null,
                )
            }
        }
    }
}
复制代码


  1. 实现说明

本商品 item 分为四部分:

第一部分:图片,我们使用 Image 实现

第二部分:商品描述,使用一个 Text

第三部分:价格,使用 Row 套两个 Text 实现

第四部分:分期情况,使用 Row 套一个 Text 和 Image 完成,注意因为图片要居右对齐,所以中间需要使用一个 Spacer 挤满剩余宽度。


淘宝商品 item 实现要点


  1. 我们可以使用 modifier = Modifier .width(200.dp) 设置 Column 的宽度
  2. Modifier.padding(all = 10.dp)可以设置四个方向的内边距
  3. modifier = Modifier.size(180.dp).clip(RoundedCornerShape(10.dp)可以设置圆角,因为本例中图片背景和控件背景都是白色,所以看不出来效果
  4. 最底部的控件需要让收藏按钮贴近父控件右侧对齐,使用 Modifier.weight 实现: Spacer(modifier = Modifier.weight(1f))



相关文章
|
XML 前端开发 IDE
在 Compose 中使用 Jetpack 组件库
在 Compose 中使用 Jetpack 组件库
1066 0
|
负载均衡 算法 Java
So easy! 教你实现自定义负载均衡策略!
So easy! 教你实现自定义负载均衡策略!
1665 0
Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用
Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用
1887 0
Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用
|
网络协议 Shell Android开发
解决adb网络连接中出现的“由于目标计算机积极拒绝,无法连接”错误
解决adb网络连接中出现的“由于目标计算机积极拒绝,无法连接”错误
解决adb网络连接中出现的“由于目标计算机积极拒绝,无法连接”错误
|
Linux iOS开发 MacOS
pnpm全局安装报错:Run “pnpm setup“ to create it automatically, or set the global-bin-dir setting, or the PN
pnpm全局安装报错:Run “pnpm setup“ to create it automatically, or set the global-bin-dir setting, or the PN
3797 0
|
9月前
|
人工智能 Prometheus 监控
监控vLLM等大模型推理性能
本文将深入探讨 AI 推理应用的可观测方案,并基于 Prometheus 规范提供一套完整的指标观测方案,帮助开发者构建稳定、高效的推理应用。
1467 169
监控vLLM等大模型推理性能
|
Kotlin
kotlin协程withContext的使用
kotlin协程withContext的使用
521 0
|
6月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
297 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
11月前
|
存储 分布式计算 Hadoop
Centos7.9安装kerberos
Centos7.9安装kerberos
319 25
|
10月前
|
人工智能 自然语言处理 网络安全
基于阿里云 Milvus + DeepSeek + PAI LangStudio 的低成本高精度 RAG 实战
阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。