Jetpack Compose常用组件详细介绍
作者:唯鹿 发布时间:2022-10-16 19:42:58
1. Text
日常最常用的应该就是显示文字,所以有必要说一下Text控件。首先源码如下:
@Composable
fun Text(
text: String,
modifier: Modifier = Modifier,
color: Color = Color.Unspecified,
fontSize: TextUnit = TextUnit.Unspecified,
fontStyle: FontStyle? = null,
fontWeight: FontWeight? = null,
fontFamily: FontFamily? = null,
letterSpacing: TextUnit = TextUnit.Unspecified,
textDecoration: TextDecoration? = null,
textAlign: TextAlign? = null,
lineHeight: TextUnit = TextUnit.Unspecified,
overflow: TextOverflow = TextOverflow.Clip,
softWrap: Boolean = true,
maxLines: Int = Int.MAX_VALUE,
onTextLayout: (TextLayoutResult) -> Unit = {},
style: TextStyle = LocalTextStyle.current
)
部分属性,见名知意,所以就不多说了。
text
:要显示的文字。显示资源使用stringResource(R.string.xxx)
modifier
上一篇有介绍,这里略过。color
:文字的颜色。如果颜色未指定,并且style
也没有设置颜色,则使用LocalContentColor
的黑色。textDecoration
:文字上绘制的装饰(例如下划线TextDecoration.Underline)。textAlign
:文字在容器内的对齐方式,例如左对齐(TextAlign.Left),居中(TextAlign.Center)。比较特别的是TextAlign.Justify
,表示在换行时拉伸所在行文字,以填充容器的宽度。
Column {
Text(
"Hello Compose Hello Compose",
modifier = Modifier.width(120.dp)
)
Text(
"Hello Compose Hello Compose",
modifier = Modifier.width(120.dp),
textAlign = TextAlign.Justify,
)
}
效果图:
其实这个属性不太适应于中文,如果你要拉伸需要文字间添加空格。不要误以为是在指定宽度内文字均匀显示。
overflow
:文字在显示不下溢出时的显示方式。TextOverflow.Clip
直接截断,TextOverflow.Ellipsis
显示省略号,TextOverflow.Visible
继续超出边界显示。
Column {
Text(
"Hello Compose Hello Compose Hello Compose",
modifier = Modifier.size(120.dp, 50.dp),
)
Text(
"Hello Compose Hello Compose Hello Compose",
modifier = Modifier.size(120.dp, 50.dp),
overflow = TextOverflow.Visible,
)
}
效果图:
注意:无法避免被其他修饰符(如Modifier.clipToBounds
)剪切。
softWrap
:文字是否自动换行。onTextLayout
:Text布局时执行的回调,返回的TextLayoutResult
对象包含段落、文字大小等信息。style
:文字样式配置,包含上面提到的一些属性,还有一些例如文字阴影,背景色等属性。默认使用上层中最近的配置。
2. Image
Image的源码如下:
@Composable
fun Image(
painter: Painter,// 或ImageBitmap,ImageVector
contentDescription: String?,
modifier: Modifier = Modifier,
alignment: Alignment = Alignment.Center,
contentScale: ContentScale = ContentScale.Fit,
alpha: Float = 1.0f,
colorFilter: ColorFilter? = null
)
painter
:绘制的图片,加载本地资源使用painterResource(id = R.drawable.xxx)
contentDescription
:描述此图像所代表的内容,用于可访问型服务。modifier
上一篇有介绍,这里略过。alignment
就是图片在固定大小中的对齐方式。一共是八个方位加一个居中九种类型。alpha
:图片透明度。colorFilter
:颜色过滤器,基本和ImageVIew的一致。比如ColorFilter.lighting(multiply: Color, add: Color)
用法和LightingColorFilter
一样,ColorFilter.colorMatrix(colorMatrix: ColorMatrix)
和ColorMatrixColorFilter
一样。这里放一个着色的小例子:
Column {
Image(
painter = painterResource(id = R.drawable.intercom_snooze),
modifier = Modifier.size(220.dp, 60.dp).background(Color.Yellow),
contentDescription = null
)
Image(
painter = painterResource(id = R.drawable.intercom_snooze),
modifier = Modifier.size(220.dp, 60.dp).background(Color.Yellow),
contentDescription = null,
colorFilter = ColorFilter.tint(color = Color.Green)
)
}
效果图:
contentScale
就是图片的在固定大小中的缩放类型,和ImageView
的scaleType
一样。这里分为以下七种类型:
(1). ContentScale.Crop
等比缩放到完全填充整个控件,如果结合Alignment.Center
就和ImageView的ScaleType.CENTER_CROP
一致。
(2). ContentScale.Fit
等比缩放到自适应整个控件,如果结合Alignment.Center
就和ImageView的ScaleType.FIT_CENTER
一致。此模式为Image默认值。对于ImageView的ScaleType.FIT_START
和ScaleType.FIT_END
其实就是调整alignment
属性。
(3). ContentScale.FillHeight
等比缩放到图片高度填满控件高度。
(4). ContentScale.FillWidth
等比缩放到图片宽度填满控件宽度。
(5). ContentScale.Inside
如果宽高大于控件宽高,则等比缩放展示。如果图片宽高小于等于控件宽高,则不缩放直接展示。结合Alignment.Center
就和ImageView的ScaleType.CENTER_INSIDE
一致。
(6). ContentScale.None
不缩放,原图大小展示。结合Alignment.Center
就和ImageView的ScaleType.CENTER
一致。
(7). ContentScale.FillBounds
拉伸图片宽高填满控件,和ImageView的ScaleType.FIT_XY
一致。
因为基本上和原生ImageView类似,这里就简单示例一下:
Column {
Image(
painter = painterResource(id = R.drawable.intercom_snooze),
modifier = Modifier.size(220.dp, 60.dp).background(Color.Yellow),
contentDescription = null
)
Image(
painter = painterResource(id = R.drawable.intercom_snooze),
modifier = Modifier.size(220.dp, 60.dp).background(Color.Yellow),
contentDescription = null,
alignment = Alignment.TopStart
)
Image(
painter = painterResource(id = R.drawable.intercom_snooze),
modifier = Modifier.size(220.dp, 60.dp).background(Color.Yellow),
contentDescription = null,
contentScale = ContentScale.Crop,
)
Image(
painter = painterResource(id = R.drawable.intercom_snooze),
modifier = Modifier.size(220.dp, 60.dp).background(Color.Yellow),
contentDescription = null,
contentScale = ContentScale.FillBounds,
)
}
效果图:
最后补充一下如何加载网络图片。目前Coil这个图片加载框架支持了Jetpack Compose
,使用时添加Coil依赖:
implementation("io.coil-kt:coil:1.4.0")
implementation("io.coil-kt:coil-compose:1.4.0")
用法:
Image(
painter = rememberImagePainter("https://xxx"),
contentDescription = null,
)
具体的功能用法可以参看文档,这里就不说明了。
对于我们习惯使用的Glide、Fresco截止本文发布前官方没有支持,但是可以使用Github上开源的landscapist,里面功能很完善,也同时支持Coil。
3. LazyColumn
系统会对所有列表项进行组合和布局,无论它们是否可见,因此如果您需要显示大量列表项(或长度未知的列表),则使用 Column
等布局可能会导致性能问题。
Compose
提供了一组组件,这些组件只会对在组件视口中可见的列表项进行组合和布局。这些组件包括 LazyColumn
和 LazyRow
。
你可以理解为一个是垂直方向滚动的RecyclerView
,一个是水平方向滚动的RecyclerView
。网格是LazyVerticalGrid
,不过目前还是实验性(当前compose 1.1)。
直接上示例:
LazyColumn(
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp),
) {
// Add a single item
item {
Text(text = "First item")
}
// Add 5 items
items(5) { index ->
Text(text = "Item: $index")
}
// Add another single item
item {
Text(text = "Last item")
}
}
contentPadding
:内容区域的内间距。verticalArrangement
:列表项之间在垂直方向上的间距。item
:添加一个列表项。items
:添加多个列表项。
效果图:
还有其他一些方法:
itemsIndexed
:用法同items,不过它会同时返回索引。stickyHeader
:粘性标题,也就是平时见到的吸顶效果。目前为实验性API,详细用法见文末链接。
rememberLazyListState
:列表的状态,提供了firstVisibleItemIndex
和firstVisibleItemScrollOffset
属性,可以实现滚动位置的监听。scrollToItem()
和animateScrollToItem()
方法,可以实现将列表滚动到指定item。用法:
val listState = rememberLazyListState()
val coroutineScope = rememberCoroutineScope()
LazyColumn(
state = listState,
) {
...
}
Button(
onClick = {
// 挂起函数,需要在协程中调用。
coroutineScope.launch {
listState.animateScrollToItem(index = 0)
}
}
) {
...
}
对于按钮(Button)、输入框(TextField)等组件,因为篇幅有限就不一一说明了,大体用法差不太多,结合文档相信你也可以快速理解。
对于ViewPager
,SwipeRefreshLayout
这类常用组件,可以使用Google开源的Accompanist。当然里面不止这些,有兴趣的可以看一下。
随着Compose的普及,开源社区上已经有了很多的组件供我们使用,对于日常开发来说已经没有什么问题了。
参考
官方文档 - 列表
官方文档 - 文字
来源:https://weilu.blog.csdn.net/article/details/123161956


猜你喜欢
- android中的下拉菜单联动应用非常普遍,android中的下拉菜单用Spinner就能实现,以下列子通过简单的代码实现 * 菜单联动。一
- 这篇文章主要介绍了JAVA利用递归删除文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 一、什么是简单工厂模式简单工厂模式又称为静态工厂模式,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父
- 本文实例讲述了C#设置页面单位和缩放的方法。分享给大家供大家参考。具体如下:using System;using System.Collec
- 事件:定义了事件成员的类允许通知其他其他对象发生了特定的事情。具体的说,定义了事件成员的类能提供以下功能1.方法能登记它对事件的关注2.方法
- 前言map的迭代删除,和我们常见的list,set不太一样,不能直接获取Iteraotr对象,提供的删除方法也是单个的,根据key进行删除,
- 首先 下载 jedis.jar包然后再 工程设置里面找到Libraries,点击+。添加下载好的jedis.jar包。点击OK退出即可创建J
- 简介因为目前做的项目查询提供的接口都使用GraphQL替代典型的REST API,所以有必要去对它进行了解和源码的阅读。本篇主要大致了解下G
- 1.引入如下依赖<dependency> <groupId>org.spri
- 本文实例为大家分享了winform实现五子棋游戏的具体代码,供大家参考,具体内容如下利用数组,根据新旧数组值的不同,获取那个点是什么棋子;说
- Spring P标签的使用Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式。由于Spring的p标签是spr
- 在使用各类App的时候,尤其是在发布朋友圈、微博的时候,都会选择配图,进入手机相册,选择自己想要的照片,作为发布内容的一部分,这里就简单介绍
- spring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuc
- 类加载器的分类。试验:使用maven打包<build> <plugins> <plu
- 获取sdcard目录 public static String getSDPath() { File sdDir
- 本文实例为大家分享了安卓实现单行多列横向滚动,供大家参考,具体内容如下<GridLayout android:layou
- 本文实例讲述了Java使用TCP套接字实现多人聊天功能。分享给大家供大家参考,具体如下:废话不多说,直接开搞:先创建一个服务端:packag
- 本文实例为大家分享了flutter日期时间选择器的具体代码,供大家参考,具体内容如下1 日期选择器 //设置默认显示的日期为当前 DateT
- 数组排序在很多的面试题上都会出现数组排序的操作形式。但是这个时候你千万别写上:java.util.Arrays.sort(数组)。而这种排序
- 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程。基本原理通用 Mapper 提供了一些通用的方法,这些通用方