《合肥市加快推进集成电路产业发展若干政策》正式发布
06-06
已经过去半年了。作为一名聋人独立开发者,我时常反思:过去六个月我进步了多少?在这篇文章中,我分享了一个使用Jetpack Compose、Material3和Kotlin语言的实现,使用Jetpack Compose、M3和Kotlin开发轮播图和列表功能。
无论您是否有开发经验,相信这篇文章都会对您有很大帮助。 1、项目背景 本应用中常见的UI需求是轮播、列表、弹窗。
使用 Jetpack Compose 和 M3 组件,可以快速高效地编码现代 UI。 2. 项目开发 2.1 介绍 Carousel UI 但很遗憾的告诉大家,目前 Jetpack Compose 本身并没有现成的 Carousel 控件(只能用 Android 原生实现 - 我会在下一篇文章中讲到 2.2 Carousel)它在首页HomeScreen中使用LazyRow实现水平滚动轮播,并展示了如何使用M3组件创建卡片式分类项并自定义颜色、样式和阴影效果。
代码语言: java copy @OptIn( ExperimentalFoundationApi::class)@Composablefun HomeScreen() { valcategories = listOf("Nim", "Nim", "Nim", "Nim", "Nim", "Nim") val grouped = listOf("Nim 大标题", "Nim 中标题", "Nim 标题").groupBy { it[3] } LazyColumn { grouped.forEach { StickyHeader { Text( text = it.value[0], style = MaterialTheme .typography.headlineMedium,颜色 = MaterialTheme.colorScheme.primary,修饰符 = Modifier.padding(16.dp) ) LazyRow { items(categories) { cat -> BrowserItem(cat = cat, drawable = R.drawable.ic_launcher_foreground) } } } } }}2.2.1 代码解释 ? LazyRow:这是水平滚动的核心组件,通过它实现左右滑动的效果。它与传统的RecyclerView类似,但使用起来简单得多。
? StickyHeader:它允许大家使用Card:来包装类别项,提供带有阴影和边框的卡片样式。 ? 图标和文本:使用这些组件以简单直观的方式显示图标和文本。
轻松实现分组列表的标题部分,就像音乐应用程序中的不同类别一样。代码语言:java 复制@OptIn(ExperimentalMaterial3Api::class)@Composablefun BrowserItem(cat: String, drawable: Int) { Card( modifier = Modifier .padding(16.dp) .size(.dp), border = BorderStroke(2) .dp,颜色= MaterialTheme.colorScheme.onSurfaceVariant),颜色= CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface,contentColor = MaterialTheme.colorScheme.onSurface),形状= MaterialTheme.shapes.medium,海拔= CardDefaults.cardElevation(8 .dp) ) { Column(verticalArrangement = Arrangement.Center,horizo??ntalAlignment = Alignment.CenterHorizo??ntally,modifier = Modifier.fillMaxSize()) { Text(text = cat, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface )间隔物(修饰符 = 修饰符.height(8.dp)) Icon( Painter = PainterResource(id = Drawable), contentDescription = cat, Modifier = Modifier.size(64.dp), Tint = MaterialTheme.colorScheme.primary ) } }}2.2.2 测试 UI代码语言: javascript copy@Preview(showBackground = true, widthDp =, heightDp = )@Composablefun PreviewHomeScreen() { HomeScreen()}@Preview(showBackground = true)@Composablefun PreviewBrowserItem() { BrowserItem(cat = "Nim", drawable = R.drawable.ic_launcher_foreground)}2.3 轮播图实现-2展示了SubscriptionScreen页面上简单轮播图的实现代码语言:java复制@Composablefun SubscriptionScreen() { Column( modifier = Modifier .fillMaxSize() .padding(16.dp),horizo??ntalAlignment = Alignment.CenterHorizo??ntally ) { Text( text = "Nim订阅页面", style = MaterialTheme.typography .headlineMedium, color = MaterialTheme.colorScheme.primary ) Spacer(modifier = Modifier.height(16.dp)) // 轮播图的实现 CarouselView( imageList = listOf( R.drawable.a, R.drawable.a, R .drawable.a, R.drawable.a, R.drawable.a ) ) }}@Composablefun CarouselView(imageList: List
当用户点击某个项目时弹出一个对话框(AlertDialog)代码语言: java copy @Composablefun MyScreen() { var showDialog by Remember { mutableStateOf(false) } var selectedItem by Remember { mutableStateOf("") } LazyColumn( modifier = Modifier .fillMaxSize() .padding(16.dp), VerticalArrangement = Arrangement.spacedBy(8.dp) ) { items(libraries) { lib -> LibItem(lib = lib, onClick = { selectedItem = lib.name showDialog = true }) } } if (showDialog) { AlertDialog( onDismissRequest = { showDialog = false }, contactButton = { TextButton(onClick = { showDialog = false }) { Text("确定") } }, title = { Text(text = "未开发") }, text = { Text(text = "您select: $selectedItem") } ) }}2.4.1 代码说明 ? LazyColumn:显示垂直列表 ? AlertDialog:使用showDialog 的布尔值来控制其显示和关闭。当用户单击列表项时,会触发弹出窗口。
代码语言:java copy @Composablefun LibItem(lib: Lib, onClick: () -> Unit) { Column { Row( modifier = Modifier .fillMaxWidth() .padding(vertical = 16.dp) .clickable { onClick() }, Horizo??ntalArrangement = Arrangement.SpaceBetween ) { Text(text = lib.name) Icon(imageVector = Icons.Default.KeyboardArrowRight, contentDescription = "向右箭头") } 分隔线(color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.2f) ) }}2.4.2 代码解释 ? clickable:用于处理用户点击事件。当用户点击某个item时,通过onClick触发相应的逻辑。
? 行:水平排列文字和图标,两端留出一定的空间,视觉上整齐。 2.4.3 测试UI代码语言:java copy @Preview(showBackground = true)@Composablefun PreviewMyScreen() { MyScreen()} 2.5 视频演示视频内容总结三 通过本Demo,使用Jetpack Compose和M3实现了常见的轮播图、列表和弹出窗口功能演示了如何高效构建现代UI界面。
希望这篇文章能够帮助大家更好地理解Compose的强大之处。未完待续,下一篇文章将介绍如何使用原生AndroidView实现类似的功能,敬请期待。
有问题请追问,感谢阅读)4.新增:/10/15-更新文章 最近看到一则更新轮播组件的新闻,说JetpackComposeM3支持最新版本的material3 1.3.04.1项目配置代码语言:javascript copy实现("androidx.compose.material3:material3:1.3.0")4.2 核心代码代码语言:java copy @OptIn(ExperimentalMaterial3Api::class)@Preview@Composableprivate fun CarouselExamples() { data class CarouselItem ( val id: Int, @DrawableRes val imageResId: Int, val contentDescription: String ) val items = Remember { listOf( CarouselItem(0, R.drawable.nim, ""), CarouselItem(1, R.drawable.nim, " "), CarouselItem (2, R.drawable.nim, ""), CarouselItem(3, R.drawable.nim,""), CarouselItem(4, R.drawable.nim, ""), ) } Horizo??ntalUncontainedCarousel( state = RememberCarouselState { items .count() }, 修饰符 = Modifier.fillMaxWidth() .wrapContentHeight() .padding(top =40.dp,底部 = 16.dp),itemWidth = .dp,itemSpacing = 8.dp,contentPadding = PaddingValues(start = 16.dp) ) { i -> val item = items[i] Image( modifier = Modifier. height(.dp) .maskClip(MaterialTheme.shapes.extraLarge), Painter = PainterResource(id = item.imageResId), contentDescription = item.contentDescription, contentScale = ContentScale.Crop ) }}4.3 视频演示视频内容 4.4 轮播图片添加边框代码实现了向轮播添加边框。您可以使用以下方法通过 maskBorder 修饰符为 maskClip 提供不同的形状: 代码语言:java copy modifier = Modifier.height(.dp) .maskClip(MaterialTheme.shapes.extraLarge)。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-17
06-18
06-21
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用