0

【扔物线】Jetpack Compose:从上手到进阶再到高手

四分卫
1月前 20

获课:xingkeit.top/14888/


从嵌入式调试的"硬核"世界,一下子跳到 Material3 的"设计"领域,这跨度确实有点大。但说实话,做应用层 UI 开发和嵌入式调试,本质都是"解决问题"——只不过前者解决的是"好不好看、好不好用",后者解决的是"能不能跑、稳不稳定"。

Material3,也就是 Material You,是 Google 在 2021 年推出的新一代设计语言。跟 Material2 比起来,它最大的变化不是多了几个控件,而是从"一套规范"变成了"一套动态配色引擎"。今天咱就聊聊,怎么用 M3 组件库快速搭出一套既有品牌感又有个性的 UI,不写一行代码,只聊思路和方法。


主题:从"换皮肤"到"动态衍生"

以前的 Android 主题,是你定好 primary color、accent color,然后所有控件统一用这几个颜色。换个主题就得重新定义一堆颜色值。M3 的革命性在于它引入了基于单一颜色源自动生成整套配色方案的机制。

你只需要给一个"种子色"(比如你的品牌主色 #FF6B35),M3 的配色算法就会自动衍生出 Primary、On Primary、Primary Container、Secondary、Tertiary 等一系列颜色。这些衍生色不是简单的"加深变浅",而是考虑了色相、饱和度、明度在不同 UI 层级上的视觉平衡。比如 Primary 用于主要按钮,Primary Container 用于卡片背景,On Primary 用于按钮上的文字——它们天然就和谐,不用设计师一个个调。

这套机制对开发者意味着什么?你不再需要设计师给你出一整张"颜色表"了。 设计师只需要定一个品牌色,然后你可以用 M3 的主题构建工具生成完整的 Light Theme 和 Dark Theme,两者自动适配。Dark Theme 也不是简单把背景变黑,而是把颜色的明度反转,同时保持色相不变,让深色模式看起来不是"负片效果",而是真正舒适的夜间阅读体验。

还有个容易被忽略的点:M3 支持动态颜色。在 Android 12 以上,系统可以从用户的壁纸里提取主色,然后 App 的主题自动跟着变。你不需要做任何额外适配——只要你的主题是基于 M3 的 Material You 引擎,App 就会自动"穿上"用户壁纸的颜色。这种"千人千面"的体验,在 Material2 时代想都不敢想。


配色:不只是"好看",更是"好用"

M3 的配色体系比 M2 复杂了不少,但复杂得有道理。它把颜色分成了十几个角色,每个角色都有明确的语义:

  • Primary:品牌色,用于主要操作按钮、选中状态、顶部应用栏。

  • Secondary:次要品牌色,用于浮动按钮、选择控件。

  • Tertiary:第三色,用于输入框光标、侧边栏高亮。

  • Error:错误状态,红色系,用于表单校验、删除操作。

  • Surface:背景色系,包括卡片、对话框、底部面板。

  • Outline:边框和分割线,灰度系。

这些颜色角色不是拍脑袋定的,而是经过了无障碍和对比度检验。M3 官方提供了一个对比度检测工具,你选好 Primary 后,它会自动校验 Primary 和 On Primary 之间的 WCAG 2.1 标准——确保文字在背景上足够清晰,色盲用户也能区分状态。

实战中我见过一个经典失误:设计师给了一个很浅的 Primary 色(比如淡粉色),M3 自动生成的 On Primary(文字色)是白色,两者对比度只有 1.2:1,按钮上的字几乎看不清。解决方案不是改文字色,而是改用 Primary Container 做背景,用 On Primary Container 做文字——这对组合允许更高的对比度,同时保留了品牌色气质。

另一个配色技巧是利用 Tone 值做层级。M3 的颜色不是单一色值,而是一整套从 0 到 100 的明度梯级。你可以用 surfaceContainerLowest 做最底层背景,surfaceContainerHigh 做悬浮卡片,surfaceContainerHighest 做弹出菜单——自然形成了视觉上的"高度感",比乱加阴影更干净。


控件:从"组装"到"即插即用"

M3 的控件库,本质上是一套经过无障碍和动效打磨的预制件。你不用再自己组合 TextInputLayout + EditText + 错误提示了,一个 OutlinedTextField 全部搞定——带标签动画、错误态、辅助文本、前缀后缀图标,全都封装好了。

Button 家族在 M3 里被分成了五种:Filled(最常用,强调度高)、Filled Tonal(柔和一些)、Outlined(边框风格)、Text(纯文字,最弱)、Elevated(带阴影)。这五种不是设计上的花活,而是有明确的使用场景——对话框里的确认操作用 Filled,取消操作用 Outlined,列表里的次要操作用 Text。你只要选对 Button 类型,UI 的视觉层次天然就清晰了。

Card 控件在 M3 里也分了等级:Elevated Card(带阴影,用于内容卡片)、Filled Card(背景色填充,用于列表项)、Outlined Card(带边框,用于设置项)。每种 Card 默认带了圆角和内边距,你只需要往里填内容就行。

Navigation 组件变化最大。Bottom Navigation 现在支持更丰富的图标+文字组合,而且选中态带有"变形"动效——图标轻微放大,文字渐显。Navigation Rail(侧边导航)在平板和折叠屏上自动切换形态,不用你写两套布局。

M3 控件库最大的价值是"规范先行"。你不需要去查 Material Design 规范文档来确认"对话框的取消按钮应该放左边还是右边"、"进度指示器的尺寸是多少 dp",因为控件已经按规范实现了,你直接拿来用就不会出错。这就像你装修房子,不是从锯木头开始,而是直接选成品柜子——省下的时间可以去做更有价值的事情。


快速搭建三部曲:从零到可运行 UI

当你拿到一个新项目,怎么用 M3 快速搭出整套 UI?我总结了一套"三步走"流程:

第一步:主题配置。在 theme.kt 里定义你的种子色,让 M3 生成 Light 和 Dark 两套配色。然后设置 Typography——M3 默认用 Google Sans 或 Roboto,你可以替换成自己的品牌字体,但要保留字重和字号体系。这一步做完,整个 App 的基础色和字体就定了,后面的所有控件都会自动继承。

第二步:布局骨架。用 Jetpack Compose 的话,就是写几个 Scaffold——顶部放 TopAppBar,底部放 NavigationBar,中间放内容区域。Scaffold 是 M3 的"画板",它帮你处理了状态栏、导航栏的避让,你不用自己算 padding。这一步做完,App 的"壳子"就有了。

第三步:填充内容。用 Card 包列表项,用 Button 做操作入口,用 TextField 做表单,用 Dialog 做确认弹窗。关键是要保持一致性——同一个场景用同一种控件变体,比如所有主要按钮都用 Filled,所有次要按钮都用 Outlined。一致性比单个控件的好看更重要,它决定了用户能不能无意识地使用你的 App。


别把 M3 当成"终点"

最后说句实在话。M3 组件库很强大,但它不是"设计自动完成器"。你把一堆 M3 控件堆在一起,不意味着 UI 就"好"了——它只是"符合规范"了。真正好的 UI,还需要考虑信息架构、交互流程、内容优先级

M3 给你的是一套"乐高积木",有标准尺寸、标准颜色、标准接口。但搭出城堡、搭出飞船、还是搭出四不像,取决于你对业务的理解和对用户的洞察。

Google 做 M3 的初衷,不是让所有 App 长得一样,而是让所有 App 在基础体验上保持一致——按钮在哪里、反馈是什么样、动效有多快——这些"底层契约"统一了,你才能在上面安心地做品牌差异化和功能创新。

下次你打开一个新项目,别急着写业务代码。先花半天把 M3 主题配好,把控件风格定好,把基准色和字号固定下来。这半天省下的,是后面整个项目周期里无数次"调颜色、改边距、对不齐"的返工时间。好的 UI 不是改出来的,是从第一天就"长"出来的。



本站不存储任何实质资源,该帖为网盘用户发布的网盘链接介绍帖,本文内所有链接指向的云盘网盘资源,其版权归版权方所有!其实际管理权为帖子发布者所有,本站无法操作相关资源。如您认为本站任何介绍帖侵犯了您的合法版权,请发送邮件 [email protected] 进行投诉,我们将在确认本文链接指向的资源存在侵权后,立即删除相关介绍帖子!
最新回复 (0)

    暂无评论

请先登录后发表评论!

返回
请先登录后发表评论!