Jetpack Compose系列(2)-基础组件

从Hello Android 开始

接上篇文章,打开默认工程后我们会看到一段Hello Android!默认代码。

class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MyApplicationTheme {// A surface container using the 'background' color from the themeSurface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {Greeting("Android")}}}}
}@Composable
fun Greeting(name: String) {Text(text = "Hello $name!")
}@Preview(showBackground = true)
@Composable
fun DefaultPreview() {MyApplicationTheme {Greeting("Android")}
}

你会发现,DefaultPreview()和Greeting()前面都有个 @ Composable。这种函数名前面加上一个 @Composable 注解的函数叫做compose函数,Jetpack Compose就是围绕 composable 函数来构建的。

Compose函数

加@Compose注解的函数可以相互调用(使用@Composable注解修饰,表示这是一个可组合函数),这些函数会被插件编译处理,所以如果一个函数不是生成UI的,那么不要用此注解。@Preview注解,可以在右边实时预览(实时预览也是更新使用JetpackCompose后有的新特性),改动函数后,刷新一个预览即可,添加该注解的外层函数不能有参数,但是里面可以嵌套一个带参数的函数来预览。可以在@Preview后面添加一个名字,如:@Preview(“code preview”)。

image.gif
此外,compose 的预览还可以同时预览多个 composable 函数,如下图:

image.gif

基础控件

0、setContent()

setContent()是ComponentActivity的一个拓展方法,其中的content参数需要传入一个由@Composable注解的函数,值得一提的是@Composable并非传统意义上的注解处理器,Compose 在 Kotlin 编译器的类型检测与代码生成阶段依赖 Kotlin 编译器插件工作,所以无需注解处理器即可使用 Compose。
image.gif
观察其源码,我们可以发现,程序逻辑会先去寻找Activity的根布局,若未找到则创建一个,然后将由@Conposable注解函数内的声明式布局创建。传入到setContent()中的Greeting()是创建的视图内容的具体声明描述罢了。

1、 文本

函数:Text()

Text("默认")

若只需要单纯的显示字符串,只需要将字符串放在Text()的括号里即可,同时也可以附上其他属性,中间用逗号隔开即可。

Text("大小、颜色", fontSize = 16.sp, color = Color.Blue)
Text("斜体", fontStyle = FontStyle.Italic , fontWeight = FontWeight.Bold)
Text("居中 字体Serif", textAlign = TextAlign.Center,modifier = Modifier.fillMaxWidth(), fontFamily = FontFamily.Serif)
Text("SansSerif字体文字溢出... ".repeat(50), maxLines = 2,overflow = TextOverflow.Ellipsis, fontFamily = FontFamily.SansSerif)

将以上Text()放到@Preview函数里可以依次看到预览:

image.gif
此外,还有这些可改变分为更大的属性:

文字可选择:SelectionContainer(){}

文字不可选择:DisableSelection(){}

可点击文字:ClickableText(){}

组合文字:buildAnnotatedString(){}

…等等,结合在一起,可以组成各种想要的花式界面,例如:

Text(buildAnnotatedString {withStyle(style = SpanStyle(color = Color.Red)) {append("H")}append("e")withStyle(style = SpanStyle(color = Color.Yellow)){append("ll")}append("o ")withStyle(style = SpanStyle(fontWeight = FontWeight.Bold, color = Color.Blue)) {append("And")}append("roid")}
)

可预览显示出:

image.gif
除此之外,Text还有以下丰富属性可供使用:

image.gif

2、Column ()

当我们要设置多个Text()时,如果你按下面方式设置,会显示如下预览界面:

image.gif
上述代码由于我们还没有提供有关如何排列它们的任何信息,因此三个文本元素显示相互重叠绘制使得文本可读性极差。

这里就要引入我们的纵向布局Column () ,名字跟Flutter中的Column Weight的名字不能说很像,只能说一模一样,当然,功能也一样。效果如下图所示:

image.gif
可见,Column()的加入使得前面重叠的Text垂直排列了,默认情况下从左上角开始往下依次排列,就像原生安卓的LinearLayout,当然,也可以进行一些样式更改。在调用Column()时传递参数来配置大小、位置以及排列方式。

Column (Modifier.background(Color.Red).width(50.dp).height(90.dp),horizontalAlignment = Alignment.CenterHorizontally,//子元素的水平方向对齐verticalArrangement = Arrangement.Center//子元素的垂直方向对齐效果
){Text(text = "11111")Text(text = "22222")Text(text = "33333")
}

此段代码运行后的效果则是:

image.gif
由此可以猜出上述代码属性功能:

Modifier.background(Color.Red).width(50.dp).height(90.dp)

这段代码声明了背景颜色及宽度和高度。此段代码等价于

Modifier.background(Color.Red).size(50.dp,90.dp)

(size、width、height在这不是必填选项,可只填背景也可只设置宽高)另外两个属性则代表意思是:

horizontalAlignment :子元素的水平方向对齐

verticalArrangement :子元素的垂直方向排列

(注意,你看上述运行效果就明白这里面的对齐排列指的是子元素Text相对于背景的属性,而不是整个屏幕)。

两个属性的取值如下表:

image.png
当然,也可以通过这两个属性来设置上下元素边距,例如:

verticalArrangement = Arrangement.spacedBy(4.dp)

3、Row ()

上述已经说明,Column()是将多个项垂直地放置在屏幕上。与此相对,使用横向布局 Row() 可将多个项水平地放置在屏幕上。Row()的属性名称跟Column()有些许差别外,其余差别不大,与之相对的属性:

horizontalArrangement :子元素的水平方向排列效果

verticalAlignmentment :子元素的垂直方向对齐效果

当然,也可以在调用的时候修改颜色、对其位置等属性:

Row (Modifier.background(Color.Red).size(90.dp,50.dp),horizontalArrangement = Arrangement.Center,//子元素的水平方向对齐verticalAlignment = Alignment.CenterVertically//子元素的垂直方向对齐效果
){Text(text = "111")Text(text = "222")Text(text = "333")
}

对应的效果为:

image.gif
取值类型和设置边距(Row()为横向)也与Column()一致。

End,有问题请留言。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024.2.2练习】子串简写(20分)

题目描述 题目思路 思维题,题型上有点双指针的感觉。如果对字符串进行暴力枚举显然会超时。不妨指针一边移动一边进行记录。当指针A移动到第个字母时,指针B移动到第个字母,并记录之前所有经过的次数。 由于找不到简洁的与的递推关系&#x…

面试经典150题 -- 哈希表(总结)

总的链接 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 383 . 赎金信 用哈希表模拟 ; 用两个长为26的整数数组模拟哈希表,分别统计r和m中的频次,如果在m中字符出现的都比r中的小,那么m一…

FUXA远程命令执行漏洞(CVE-2023-33831)

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义

链表 空链表: 注意:函数不能返回局部变量的地址 操作: 1.创建空链表 2.头插 3.尾插 4.链表遍历 5.链表的长度 free:释放 删除: 头删 void popFront(struct Node *head) { //1.p指针变量指向首节点 //2.断…

BeanDefinitionReader学习

Spring版本5.1.0 Spring中的BeanDefinitionReader是一个接口,用于读取BeanDefinition并将其注册到Spring容器中。BeanDefinitionReader的主要作用是从资源文件中读取配置信息,并将其转换为BeanDefinition对象,然后将其注册到Spring容器中。B…

springboot完成一个线上图片存放地址+实现前后端上传图片+回显

1.路径 注意路径 2.代码:(那个imagePath没什么用,懒的删了),注意你的本地文件夹要有图片,才可以在线上地址中打开查看 package com.xxx.common.config;import org.springframework.beans.factory.annotat…

【云手机】快速获取一台属于你的云手机,在云上调试你的应用!

0x00 前言 随着科技的飞速发展,云手机已然成为一种云端虚拟商品,它打破地域限制,让你随时随地畅享移动体验。红手指、小鱼云手机等平台虽便捷易用,却在可扩展性和隐私性方面有所欠缺。冗长的《隐私政策》是否让你望而却步&#x…

LabVIEW潜油电泵数据采集系统

LabVIEW潜油电泵数据采集系统 介绍一个基于LabVIEW的潜油电泵数据采集系统。该系统目的是通过高效的数据采集和处理,提高潜油电泵的性能监控和故障诊断能力。 系统由硬件和软件两部分组成。硬件部分主要包括数据采集卡、传感器和电泵等,而软件部分则是…

网络开启代理之后git还是连接超时

网络开启代理之后git还是连接超时 当电脑开启网络代理之后,浏览器能够正常访问GitHub,可是使用git拉取仓库时还是超时。 问题 $ git clone https://github.com/xxx/notes.git Cloning into notes... fatal: unable to access https://github.com/xxx/…

ARM架构可视化ROS消息方案部署

ARM架构可视化ROS消息方案部署 三种方案, 1. webviz 2. foxglove 3. rosviz 注: web要用firefox, chromimum用不了, 可能是因为取消了时间同步机制的原因 先说三种方案的优劣, webviz 延迟比较高, 但是部署相对简单, foxglove 部署比较费劲, 但是效果不错, 延迟低, 本文会尽…

KMP算法解决——找出字符串中第一个匹配项的下标(深入图解KMP算法)

"The only way to do great work is to love what you do." ​- Steve Jobs 首先我们先来回顾一下题目: 1. 先正儿八经的拿比较官方的说法来解释一下KMP算法 KMP(Knuth-Morris-Pratt)算法是一种用于在一个文本串中查找一个模式串…

睿尔曼超轻量仿人机械臂—外置按钮盒使用说明

睿尔曼RM系列机械臂的控制方式有很多种,包括:示教器、JSON、API等。在此为大家介绍外置按钮盒的使用方法。 按钮盒接线安装 按钮盒外观如下图所示,有:急停、暂停、开始、继续。四个功能按钮。用户可通过这四个按钮来实现对机械臂运…