HarmonyOS 应用开发《掌上英语》第74篇:沉浸光感与系统材质:用 systemMaterial 打造沉浸式单词学习体验
沉浸光感与系统材质:用 systemMaterial 打造沉浸式单词学习体验
一、从扁平到沉浸:UI 设计语言的进化
HarmonyOS 6.0 引入的沉浸光感(Immersive Lighting)设计语言,标志着系统 UI 从"扁平化"向"空间化"的演进。其核心是三个视觉要素:毛玻璃(Glassmorphism)、空间动效(Spatial Motion)和光影层次(Light & Shadow)。在之前的版本中,要实现毛玻璃效果需要开发者自行处理模糊渲染和颜色叠加,性能开销大且效果参差不齐。HarmonyOS 6.0 通过systemMaterial通用属性和backgroundBlurStyle接口,将系统级的毛玻璃渲染能力以声明式 API 的形式开放给开发者。
二、systemMaterial 通用属性详解
systemMaterial是 HarmonyOS 6.0 新增的通用属性,支持在大多数容器组件(如Column、Row、Flex、Stack、Grid等)上直接设置系统材质效果。它有三种预设样式:
SystemMaterialStyle.BLUR:标准毛玻璃效果,适用于需要突出前景内容的背景区域。SystemMaterialStyle.TRANSPARENT:透明材质,适用于需要透出底层内容但又有轻微纹理的场景。SystemMaterialStyle.TRANSLUCENT:半透明材质,介于毛玻璃和透明之间。
Column().systemMaterial(SystemMaterialStyle.BLUR).width('100%').height(100)对于需要更精细控制的场景,backgroundBlurStyle提供了参数化的毛玻璃配置,包括模糊半径、颜色叠加和饱和度调整:
Column().backgroundBlurStyle({ style: BlurStyle.Thin, colorMode: ThemeColorMode.LIGHT, scale:1.0, saturation:1.2, brightness:1.0, })三、首页今日学习进度卡的毛玻璃改造
在我们的 App 首页MainPage中,"今日学习进度卡"展示了用户当天的单词学习进度(已学 X/30 词)。原始实现使用的是纯色背景加圆角。在 HarmonyOS 6.0 中,我们可以将其升级为毛玻璃效果,让卡片背后的壁纸或渐变背景透出,营造更通透的视觉感受。
@BuildertodayStudyBuilder() { Column() {// 进度卡内容Text('今日学习').fontSize(16).fontWeight(FontWeight.Bold);// 进度条Progress({ value: this.getTodayProgress(), total:30}) .width('100%') .height(8) .color(Color.White); }.width('100%').padding(16).systemMaterial(SystemMaterialStyle.BLUR)// 毛玻璃效果.borderRadius(16) }需要注意的是,systemMaterial需要背景内容才能展现毛玻璃效果。如果在MainPage的根节点设置了纯色背景,毛玻璃是无法"透"出内容的。正确的做法是:根节点使用渐变或图片背景,子卡片使用毛玻璃效果。我们的 App 目前使用sys.color.background_secondary作为背景色,可以将其替换为一张渐变色背景图或@ohos.media.image生成的动态渐变。
四、单词卡片正反面:毛玻璃与纯色的对比
在CourseHomePage的单词卡片设计中,我们可以做一个有趣的区分——卡片正面(展示单词、音标)使用systemMaterial毛玻璃效果,卡片反面(展示释义、例句)使用纯色背景。这种设计有三层含义:
- 视觉聚焦:正面使用毛玻璃,让单词文字"浮"在背景之上,视觉上更突出。
- 信息层次:反面纯色提供干净的信息阅读环境,适合阅读较长的例句和翻译。
- 翻转反馈:翻转动画过程中,毛玻璃和纯色的切换给用户明确的状态标识——"我看到了正面" vs "我看到了反面"。
Column() { if (this.isFlipped) {// 反面:纯色背景Column() { Text(this.translation).fontSize(20); Text(this.example).fontSize(14).opacity(0.7); }.width('100%').height('100%').backgroundColor(Color.White).borderRadius(16); } else {// 正面:毛玻璃效果Column() { Text(this.word).fontSize(32).fontWeight(FontWeight.Bold); Text(this.phonetic).fontSize(16).opacity(0.8); }.width('100%').height('100%').systemMaterial(SystemMaterialStyle.BLUR).borderRadius(16); } }五、TopBar 导航栏的毛玻璃悬浮感
App 的TopBar导航栏是另一个适合使用毛玻璃的组件。在commonLib/TopBar.ets中,导航栏的背景可以替换为毛玻璃效果,配合标题文字的阴影,营造出"悬浮"在页面内容之上的视觉效果。
实现的关键是让TopBar的position设置为absolute或使用Stack布局,让内容滚动时从导航栏下方穿过。毛玻璃的模糊效果会让穿过导航栏的内容产生"被遮挡但隐约可见"的层次感,这正是沉浸光感设计语言的核心体验之一。
Row() { Image($r('app.media.ic_back')).width(24).height(24); Text('课程学习').fontSize(18).fontWeight(FontWeight.Bold); Blank(); }.width('100%').height(56).padding({ left:16, right:16}).systemMaterial(SystemMaterialStyle.BLUR).position({ top:0}).zIndex(10);六、实践建议:局部替换,保持整体色调
在引入 systemMaterial 时,建议遵循"渐进式替换"的原则:
- 先替换背景有内容的组件:如首页进度卡、课程卡片等,这些组件的背景通常是壁纸或渐变,毛玻璃效果最明显。
- 保持整体色系不变:
systemMaterial会自动适配系统的亮色/暗色模式,不需要额外配置颜色值。在亮色模式下,毛玻璃叠加浅色模糊;在暗色模式下,叠加深色模糊。 - 关注性能:毛玻璃渲染涉及模糊计算,过多组件同时使用可能会有性能影响。建议仅在 3-5 个核心组件上使用,如首页进度卡、TopBar、单词卡片正面和设置页弹窗。
- 测试覆盖:在不同分辨率和设备类型上测试毛玻璃效果,确保模糊半径和颜色叠加在各设备上表现一致。
七、总结
systemMaterial和沉浸光感是 HarmonyOS 6.0 在 UI 领域最重要的创新之一。通过系统级的毛玻璃渲染能力,我们的英语学习 App 在不增加复杂度和性能开销的前提下,获得了媲美高端应用的视觉质感。从首页进度卡、单词卡片到 TopBar 导航栏,毛玻璃效果让 App 的界面更加通透、精致,为用户带来沉浸式的英语学习体验。