当前位置: 首页 > news >正文

第六章:UI组件与Material3主题

第六章:UI 组件与 Material3 主题

Material3 是 Android 最新设计语言,Compose 原生支持,主题配置更简单。


6.1 主题配置

// Theme.kt@ComposablefunMyFirstComposeTheme(darkTheme:Boolean=isSystemInDarkTheme(),dynamicColor:Boolean=true,content:@Composable()->Unit,){valcolorScheme=when{dynamicColor&&Build.VERSION.SDK_INT>=Build.VERSION_CODES.S->{valcontext=LocalContext.currentif(darkTheme)dynamicDarkColorScheme(context)elsedynamicLightColorScheme(context)}darkTheme->DarkColorSchemeelse->LightColorScheme}MaterialTheme(colorScheme=colorScheme,typography=Typography,content=content,)}

主题特点:

  • dynamicColor— Android 12+ 支持从壁纸提取颜色
  • darkTheme— 自动跟随系统深色模式
  • colorScheme— Material3 颜色体系(primary/secondary/tertiary)

6.2 颜色定义

// Color.ktvalPurple80=Color(0xFFD0BCFF)valPurpleGrey80=Color(0xFFCCC2DC)valPink80=Color(0xFFEFB8C8)valPurple40=Color(0xFF6650a4)valPurpleGrey40=Color(0xFF625b71)valPink40=Color(0xFF7D5260)
颜色角色浅色模式深色模式
primaryPurple40Purple80
secondaryPurpleGrey40PurpleGrey80
tertiaryPink40Pink80

6.3 通用组件:ArticleItem

列表卡片组件:

@ComposablefunArticleItem(title:String,description:String?,thumbnail:String?,onClick:()->Unit,){Card(modifier=Modifier.fillMaxWidth().padding(12.dp).clickable(onClick=onClick),){Column{ArticleImage(imageUrl=thumbnail.orEmpty(),contentDescription=title,modifier=Modifier.fillMaxWidth().height(180.dp),)Text(text=title,fontWeight=FontWeight.Bold)Text(text=description?:"暂无描述")}}}

Card 特点:

  • 带圆角和阴影的容器
  • modifier 配置点击事件
  • 内部 Column 竖向排列子组件

6.4 图片组件:ArticleImage

预览模式下显示占位图,运行时加载网络图片:

@ComposablefunArticleImage(imageUrl:String,modifier:Modifier=Modifier,contentDescription:String?=null,){if(LocalInspectionMode.current){// Preview 模式:显示占位图,不发网络请求Box(modifier=modifier.background(MaterialTheme.colorScheme.surfaceVariant),contentAlignment=Alignment.Center,){Icon(Icons.Default.Image,contentDescription=contentDescription)}}else{// 运行时:使用 Coil 加载网络图片AsyncImage(model=imageUrl,contentDescription=contentDescription,modifier=modifier,contentScale=ContentScale.Crop,)}}

LocalInspectionMode:

  • Composable 在 Android Studio Preview 时为 true
  • 用于区分预览环境与真实运行环境

6.5 轮播图组件:BannerView

使用 HorizontalPager 实现自动轮播:

@ComposablefunBannerView(images:List<String>){if(images.isEmpty())returnvalpagerState=rememberPagerState(pageCount={images.size})LaunchedEffect(Unit){while(true){delay(3000)valnextPage=(pagerState.currentPage+1)%images.size pagerState.animateScrollToPage(nextPage)}}Box{HorizontalPager(state=pagerState,modifier=Modifier.height(200.dp)){page->AsyncImage(model=images[page],contentDescription=null)}// 底部指示器Row(modifier=Modifier.align(Alignment.BottomCenter)){repeat(images.size){index->Box(modifier=Modifier.size(8.dp).clip(CircleShape).background(if(pagerState.currentPage==index)Color.WhiteelseColor.Gray))}}}}

关键点:

  • rememberPagerState保存分页状态
  • LaunchedEffect启动协程控制自动轮播
  • 页面指示器根据当前页切换颜色

6.6 头像组件:ProfileAvatar

@ComposablefunProfileAvatar(avatarUrl:String,modifier:Modifier=Modifier){if(LocalInspectionMode.current){Box(modifier=modifier.clip(CircleShape).background(primary.copy(alpha=0.15f)),contentAlignment=Alignment.Center,){Icon(Icons.Default.Person,modifier=Modifier.size(48.dp))}}else{AsyncImage(model=avatarUrl,contentDescription="用户头像",modifier=modifier.clip(CircleShape),contentScale=ContentScale.Crop,)}}

6.7 主题使用示例

@ComposablefunDetailArticleBody(article:ArticleBean){Column(modifier=Modifier.padding(16.dp)){Text(text=article.title,style=MaterialTheme.typography.headlineSmall,// 使用主题字体fontWeight=FontWeight.Bold,)Text(text=${"%.2f".format(article.price)}",color=MaterialTheme.colorScheme.primary,// 使用主题颜色fontSize=22.sp,)Card(colors=CardDefaults.cardColors(containerColor=MaterialTheme.colorScheme.surfaceContainerHigh,),){/* ... */}}}

6.8 总结

  • Material3 主题支持动态颜色(Android 12+)
  • LocalInspectionMode 区分预览/运行模式
  • Coil 异步加载网络图片
  • HorizontalPager 实现轮播
  • Card 提供圆角阴影容器
  • 颜色/字体均通过 MaterialTheme 主题统一管理

上一章:第五章:数据层 — 网络请求与 Repository 下一章:第七章:状态管理实战与架构总结

http://www.jsqmd.com/news/842547/

相关文章:

  • Blender-Armatures
  • C51可重入函数原理与实践指南
  • 2026香柚果茸厂家推荐:优质原料直采,风味纯正 - 栗子测评
  • 第一阶段开发复盘与优化纪要
  • 电镀整流机源头厂家:企业采购选型策略深度解析
  • HTML代码加密工具源码_在线网页加密解密_防复制源码
  • 2026合金铝板定制厂家甄选:花纹铝板生产厂家+防滑铝板生产厂家+防滑铝板源头厂家汇总 - 栗子测评
  • 向量数据库横评:Milvus vs Pinecone vs Weaviate 选型指南
  • NotebookLM具身智能落地实战(从零部署到ROS2集成):谷歌AI团队内部培训手册泄露版
  • 解决FlexNet Publisher许可证协议不匹配错误-83
  • 2026铝板定制加工厂推荐盘点:靠谱保温铝板生产厂家+冲压用铝板源头厂家推荐 - 栗子测评
  • 长期项目使用 Taotoken 聚合 API 在模型选型与切换上的便利性体验
  • ABAP RFC调用避坑指南:从`SY-SUBRC`错误码到`CX_ROOT`异常处理的完整实战
  • Equalizer APO终极指南:免费开源的系统级音频均衡解决方案
  • 大模型推理速度慢?用 TensorRT + 量化技术实现 3 倍提速
  • PL/SQL核心技术难点梳理与实战应用案例解析
  • PS网页版源码_在线Photoshop源码_Nginx免环境部署_支持PSD
  • 数组指针VS指针数组
  • 低成本玩转BK7231U:基于CH341A与SPI的固件烧录实战
  • 从官方镜像到专属系统:手把手教你用开源工具定制个人版精简Windows 11
  • 第七章:状态管理实战与架构总结
  • 2026香柚汁厂家推荐:NFC果汁原料厂家,原料甄选,新鲜锁鲜 - 栗子测评
  • 概率计算与突触可塑性:隐藏p-bit机制解析
  • JDBC(四):Statement
  • 滑动平均滤波的“黄金分割点”:如何为你的传感器数据选择最佳窗口大小?(以AD7734为例)
  • 兼容多系统的音视频时长统计工具
  • 健身房私教管理系统 01:用户体系与多角色注册闭环
  • 2026年热门的钢制侧向防火卷帘多家厂家对比分析 - 品牌宣传支持者
  • Docker Compose部署Nginx Proxy Manager保姆级教程:从端口映射到数据持久化全解析
  • STM32F108C8T6小白入门特训营__1.4GPIO.C 代码分析