Compose 基础组件

文章目录

  • Compose 基础组件
    • Modifier 修饰符
    • Scaffold 脚手架

Compose 基础组件

Modifier 修饰符

在传统视图体系中,使用XML文件描述组件的样式,而在Compose中使用Modifier,每个基础的Composable组件都有一个modifier参数,通过Modifier可以修改样式如边距、字体、位移等。

内边距:

@Stable
fun Modifier.padding(
    start: Dp = 0.dp,
    top: Dp = 0.dp,
    end: Dp = 0.dp,
    bottom: Dp = 0.dp
)

@Stable
fun Modifier.padding(
    horizontal: Dp = 0.dp,
    vertical: Dp = 0.dp
)

@Stable
fun Modifier.padding(all: Dp)

尺寸:

Text("hello world", modifier = Modifier.fillMaxSize()) // 填充父容器

Text("hello world", modifier = Modifier.fillMaxWidth()) // 只充满宽
Text("hello world", modifier = Modifier.fillMaxHeight()) // 只充满高

Text("hello world", modifier = Modifier.size(100.dp)) // 宽高都为100dp
Text("hello world", modifier = Modifier.size(width = 100.dp, height = 110.dp)) // 宽为100dp,高为110dp

// 仅在Box组件中使用
Box {
    Spacer(Modifier.matchParentSize().background(Color.Red))
    Text("hello world", fontSize = 30.sp)
}

Row和Column的weight修饰符:

Row(Modifier.fillMaxSize().padding(top = 10.dp)) {
    Box(Modifier.weight(2f).height(50.dp).background(Color.Blue))
    Box(Modifier.weight(1f).height(50.dp).background(Color.Red))
}

点击:

Modifier.size(50.dp).background(Color.Green).clickable {
    // 执行点击事件需要的操作
}

圆角:

@Stable
fun Modifier.shadow(
    elevation: Dp, // 阴影的高度
    shape: Shape = RectangleShape, // Shape
    clip: Boolean = elevation > 0.dp // 是否将内容图形裁剪到该形状
)

Scaffold 脚手架

在这里插入图片描述

在这里插入图片描述

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val tabs = Tabs.values()
            var position by remember { mutableStateOf(Tabs.ONE) }

            Scaffold(
                // 标题栏
                topBar = {
                    TopAppBar(title = { Text("标题") }, navigationIcon = {
                        IconButton(onClick = { /*TODO*/ }) {
                            Icon(Icons.Filled.ArrowBack, null)
                        }
                    })
                },
                // 悬浮按钮
                floatingActionButton = {
                    FloatingActionButton(onClick = { /*TODO*/ }) {
                        Text("确定")
                    }
                },
                // 侧边栏
                drawerContent = {
                    Column(
                        modifier = Modifier.fillMaxSize(),
                        verticalArrangement = Arrangement.Center,
                        horizontalAlignment = Alignment.CenterHorizontally
                    ) {
                        Text("侧边栏")
                    }
                },
                // 底部导航栏
                bottomBar = {
                    BottomNavigation(backgroundColor = Color.Gray) {
                        tabs.forEach { tab ->
                            BottomNavigationItem(
                                label = { Text(tab.title) },
                                icon = { Icon(painterResource(tab.icon), null) },
                                selected = tab == position,
                                onClick = { position = tab },
                                alwaysShowLabel = false,
                                selectedContentColor = Color.Red,
                                unselectedContentColor = Color.White
                            )
                        }
                    }
                }) { paddingValues ->
                // 内容
                Box(modifier = Modifier.padding(paddingValues)) {
                    when (position) {
                        Tabs.ONE -> OnePage()
                        Tabs.TWO -> TwoPage()
                        Tabs.THREE -> ThreePage()
                        Tabs.FOUR -> FourPage()
                    }
                }
            }
        }
    }
}
enum class Tabs(val title: String, @DrawableRes val icon: Int) {
    ONE("one", R.drawable.ic_one),
    TWO("two", R.drawable.ic_two),
    THREE("three", R.drawable.ic_three),
    FOUR("four", R.drawable.ic_four)
}

@Composable
fun BaseDefault(content: String) {
    Row(
        modifier = Modifier.fillMaxSize(),
        horizontalArrangement = Arrangement.Center,
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(content, fontSize = 50.sp)
    }
}

@Composable
fun OnePage() {
    BaseDefault("OnePage")
}

@Composable
fun TwoPage() {
    BaseDefault("TwoPage")
}

@Composable
fun ThreePage() {
    BaseDefault("ThreePage")
}

@Composable
fun FourPage() {
    BaseDefault("FourPage")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/554766.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Conmi的正确答案——JDK22运行js(基于Graal.js)

JDK版本:graalvm-jdk-22.0.18.1 1、进入官网:https://www.graalvm.org/ 2、点击下载 3、选择JDK版本 4、选择平台 5、选择下载 6、下载完成后,重回该页面,选中“Graal Projects”,选择“GraalJS” 7、选择“Try Now…

jenkin构建项目并使用docker部署发布

将打包好的jar包和Dockerfile复制到/root/app/qilaike-admin shell脚本 #!/bin/bash#DATE$(date %Y%m%d)cd /root/app/qilaike-admin#检查容器是否存在 if [ x"$(docker ps -a | awk ($2 ~ /qilaike-admin:*/) {print $1})" ! x"" ]; then# shellcheck di…

线程池学习(通俗易懂)

线程池 线程池是什么ThreadPoolExecutor模拟实现线程池结语 线程池是什么 假设我们要频繁的创建线程和销毁线程,但是创建线程和销毁线程是有成本的. 所以我们可以提前创建一批线程,后面需要使用的时候,直接拿就可以了,这就是线程池. 当线程不再使用的时候,就归还到池子里.为什…

2.8 构建gradle环境

构建gradle环境 目录一、安装Java Development Kit (JDK)二、下载Gradle三、解压Gradle四、配置环境变量五、验证安装六、gradle构建java项目七、eclipse配置gradle 目录 一、安装Java Development Kit (JDK) Gradle是基于Java开发的,所以首先需要安装JDK。你可以从…

Dragonfly Topology 蜻蜓网络拓扑

蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数2. Topology Description 拓扑描述3. Topology Variations 拓扑变体 蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数 Dragonfly拓扑参数: N N N: 网络中终端(terminal)的总数量 p p p: 连接到每个路由器的终端数量 a a a: 每…

类加载子系统

一.类加载子系统的作用 类加载子系统(Class Loading Subsystem)是Java虚拟机的一个重要组成部分,它将Class文件加载到内存中。不同语言程序可以使用编译器生成符合JVM规范的Class文件,Class文件要求在文件开头有特定的文件标识。…

湖仓一体(Lakehouse)架构的核心组件之存储层——Lakehouse 架构(三)

文章目录 前言Lakehouse 存储关键概念行存储与列存储基于存储的查询性能优化 Lakehouse 存储组件云储存文件格式Apache ParquetApache ORCApache Avro相似点和差异点 表格格式Apache HiveIceberg特性和优点 Apache Hudi特性和优点 Delta Lake特性和优点 相似点和差异点 总结 前…

李沐51_序列数据——自学笔记

1.时序模型中,当前数据跟之前观察到的数据相关 2.自回归模型使用自身过去数据来预测未来 3马尔可夫模型假设当前只跟最近少数数据相关,从而简化模型 4.潜变量模型使用潜变量来概括历史信息 生成一些数据:使用正弦函数和一些可加性噪声来生…

【OpenGL开发】PyQt在关闭应用程序时没有运行析构函数的问题

PyQt在关闭应用程序时没有运行析构函数的问题 目录 一、说明二、python的析构函数三、通用版QT5 存在一些问题四、python版PyQt5 存在一些问题五、OpenGL的析构问题5.1 OpenGL很脆弱,这不是危言耸听5.2 以上OpenGL问题解决方法六、一些保留意见一、说明 应用QT做程序界面,在…

工业自动化的未来:UWB模块驱动下的生产优化

随着工业自动化技术的不断发展,UWB技术正在成为工业生产优化的关键驱动力之一。UWB模块作为UWB技术的核心组成部分,具有精准定位、抗干扰、快速响应等特点,为工业自动化提供了新的解决方案和发展机遇。本文将探讨UWB模块驱动下的工业生产优化…

ug钣金展开图教程

UG钣金件如何展平,ug钣金展开步骤?一起来探讨。 第一步:准备一个钣金零件图档(如下图)我们需要进入UG开始-所以应用模块-钣金-NX钣金。 要把这个零件转化为钣金零件,这样才可以进行下一步骤展开。选择转化为钣金,在基本面选择任意一个零件表…

Mysql基础知识学习总结

文章目录 一.数据库的相关概念二.关系模型的核心概念三.SQL分类四.SQL语句注释命令行连接Mysql客户端desc基本用法输出解释示例 show基本用法显示数据库列表显示当前数据库中的表显示表的列信息显示表的索引信息显示服务器状态和系统变量显示创建表的SQL语句显示当前的权限 sel…

遇事不决 量子力学?

文章目录 引入量子力学产生的必然性量子力学名称的由来粒子?波?波粒二象性测不准原理 (不确定原理)叠加态原理 量子纠缠态叠加量子纠缠量子纠缠实验 逻辑判断,量子力学到底完善吗观测量子纠缠?那我们宏观世…

idea中停止运行Vue

在里面敲入Ctrlc 输入y确定即可。

音频调试(2)

前言: 大家好,今天继续分享记录一下最近的音频调试心得!同时这个过程中,也有朋友过来交流音频的问题,通过交流,也是学习到了新东西! 视频和音频复合推流: 在上一篇文章里面有提到fdk…

如何批量在文件名前加序号?文件增加序号前缀的方法 四个方法推荐给你

在日常工作和生活中,我们经常需要处理大量的文件,为了方便管理和查找,给文件增加序号前缀是一种常见的做法。下面将介绍几种给文件增加序号前缀的方法,帮助您更高效地整理文件。 方法一,使用【汇帮批量重命名】添加序…

on display 与on show的区别 展示 Show也用来表达电视节目。”秀” 就是Show的音译。

on show 表演,秀,吸引别人过来看 The most wonderful piece of machinery on show was Nasmyth’s steam hammer. on display 只展示, 有可能他人不会注意 Many colorful clothes are displayed in the showcase. 展示柜里摆放着很多鲜艳…

ASV1000视频监控中心录像服务器,实现存满天数,自动覆盖

目录 一、需求 二、需求分析 (一)录像存满自动覆盖的定义 (二)录像存满指定的天数自动覆盖 三、录像存满天数后自动覆盖在AS-V1000的实现 (一)要考虑的问题 1、确定存储需求 2、设置录像计划 3、配…

ts封装axios遇到的问题

在使用ts封装axios时,这里总是有一个报错,经过一顿搜索,发现错误原因:在TypeScript中,函数的参数类型和返回类型是不等价的,因此导致类型不匹配。 解决方法:将 AxiosRequestConfig 改成 Interna…

2024年第二届“天洑杯”数据建模大赛赛题答疑

“天洑杯”数据建模大赛旨在促进数据分析建模技术的推广和发展,培养一批具有用数据思维解决复杂问题能力的优秀人才,推动高水平人工智能交叉学科人才队伍建设。大赛鼓励参赛选手立足于自身的专业背景和工程实践技能,结合数据科学与人工智能相…