news 2026/5/2 12:33:28

【HarmonyOS 6】底部悬浮导航的沉浸光感适配(API23)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【HarmonyOS 6】底部悬浮导航的沉浸光感适配(API23)

往期回顾:【HarmonyOS 6】基于API23的底部悬浮导航

在上一篇中,我们完成了基于 API23 的HdsTabs底部悬浮导航栏搭建,实现了:

  • API23+设备使用HdsTabs悬浮底栏 +gradientMask渐变遮罩
  • API22 及以下自动回退到传统Tabs+ 自定义玻璃导航栏

但当时我们只实现了"悬浮玻璃感",还没有接入官方提供的沉浸光感材质能力。从 HarmonyOS 6.1.0(23) 版本开始,HDS 组件新增了systemMaterialEffect参数,可以为底部页签设置真正的系统级沉浸光感视效。

今天我们就来把这个能力接上。


一、什么是沉浸光感

沉浸光感是 HarmonyOS 6.1.0(23) 引入的一种系统级材质效果,它能让 UI 组件与底层内容产生"毛玻璃 + 光影渗透"的高级视觉体验。

对于底部悬浮导航栏,通过HdsTabsFloatingStylesystemMaterialEffect参数即可开启。


二、前置回顾:当前导航栏的调用方式

在接入沉浸光感之前,我们先快速回顾一下当前项目中底部导航栏的整体架构。

2.1 导入依赖

import{HdsTabs,HdsTabsController,hdsMaterial}from'@kit.UIDesignKit';import{SymbolGlyphModifier}from'@kit.ArkUI';

注意:相比前一篇,这里我们新增导入了hdsMaterial,这是开启沉浸光感的必要模块。

2.2 能力检测与路由分发

@StateuseApi23FloatingNav:boolean=false;privatehdsTabController:HdsTabsController=newHdsTabsController();aboutToAppear():void{this.detectApi23FloatingNav();}privatedetectApi23FloatingNav():void{try{constsdkApiVersion:number=deviceInfo.sdkApiVersion;this.useApi23FloatingNav=sdkApiVersion>=23;}catch(error){this.useApi23FloatingNav=false;}}build(){if(this.isDesktopMode()){Row(){this.DesktopSidebar()Column(){this.DesktopContent()}.layoutWeight(1).height('100%')}.width('100%').height('100%')}else{if(this.useApi23FloatingNav){this.Api23FloatingMobileTabs();}else{this.LegacyMobileTabs();}}}

这套"能力分流"的设计思路贯穿整个项目:先检测、再分支、最后兜底。


三、沉浸光感适配:改动点在哪里

整个适配的核心改动集中在一个位置Api23FloatingMobileTabs()方法中的.barFloatingStyle()配置。

3.1 适配前

这是上一篇文章中的配置:

.barFloatingStyle({barBottomMargin:16,gradientMask:{maskColor:'#66F1F3F5',maskHeight:92}})

3.2 适配后(叠加沉浸光感)

在保留原有样式的基础上,新增systemMaterialEffect配置

.barFloatingStyle({barBottomMargin:16,gradientMask:{maskColor:'#66F1F3F5',maskHeight:92},systemMaterialEffect:{materialType:hdsMaterial.MaterialType.ADAPTIVE,materialLevel:hdsMaterial.MaterialLevel.ADAPTIVE}})

就这两行配置,底部悬浮页签就升级为"官方沉浸光感材质"。


四、完整实现代码

以下是我们项目entry/src/main/ets/pages/Index.etsAPI23 悬浮导航的完整真实实现

@BuilderApi23FloatingMobileTabs(){HdsTabs({controller:this.hdsTabController}){TabContent(){this.HomeContent()}.tabBar(newBottomTabBarStyle({normal:this.buildTabSymbol(this.getTabSymbol(0),false),selected:this.buildTabSymbol(this.getTabSymbol(0),true)},'首页'))TabContent(){CheckInTabContent()}.tabBar(newBottomTabBarStyle({normal:this.buildTabSymbol(this.getTabSymbol(1),false),selected:this.buildTabSymbol(this.getTabSymbol(1),true)},'打卡'))TabContent(){WaterTabContent({currentTab:this.currentTabIndex})}.tabBar(newBottomTabBarStyle({normal:this.buildTabSymbol(this.getTabSymbol(2),false),selected:this.buildTabSymbol(this.getTabSymbol(2),true)},'饮水'))TabContent(){ExerciseTabContent()}.tabBar(newBottomTabBarStyle({normal:this.buildTabSymbol(this.getTabSymbol(3),false),selected:this.buildTabSymbol(this.getTabSymbol(3),true)},'运动'))TabContent(){SleepTabContent()}.tabBar(newBottomTabBarStyle({normal:this.buildTabSymbol(this.getTabSymbol(4),false),selected:this.buildTabSymbol(this.getTabSymbol(4),true)},'睡眠'))TabContent(){ProfileTabContent({currentTab:this.currentTabIndex})}.tabBar(newBottomTabBarStyle({normal:this.buildTabSymbol(this.getTabSymbol(5),false),selected:this.buildTabSymbol(this.getTabSymbol(5),true)},'我的'))}.width('100%').height('100%').barOverlap(true).barPosition(BarPosition.End).vertical(false).barFloatingStyle({barBottomMargin:16,gradientMask:{maskColor:'#66F1F3F5',maskHeight:92},systemMaterialEffect:{materialType:hdsMaterial.MaterialType.ADAPTIVE,materialLevel:hdsMaterial.MaterialLevel.ADAPTIVE}}).onChange((index:number)=>{this.currentTabIndex=index;if(index===0){this.refreshHomeData();}})}

配合图标构建方法:

privatebuildTabSymbol(symbol:Resource,selected:boolean):SymbolGlyphModifier{returnnewSymbolGlyphModifier(symbol).fontColor([selected?$r('app.color.primary_color'):$r('app.color.inactive_color')]);}privategetTabSymbol(index:number):Resource{switch(index){case0:return$r('sys.symbol.house');case1:return$r('sys.symbol.square_and_pencil');case2:return$r('sys.symbol.cup');case3:return$r('sys.symbol.figure_run');case4:return$r('sys.symbol.sleep');default:return$r('sys.symbol.person');}}

五、关键参数详解

5.1 systemMaterialEffect 的两个属性

属性类型选用的值含义
materialTypehdsMaterial.MaterialTypeADAPTIVE材质类型交由系统自适应决定
materialLevelhdsMaterial.MaterialLevelADAPTIVE材质等级交由系统自适应决定

开发者只需写一次配置,就能在所有设备上获得最佳体验。

5.3 MaterialType 与 MaterialLevel 可选值

如果不想用自适应,也可以手动指定:

MaterialType(材质类型):

枚举值说明
ADAPTIVE系统自适应
IMMERSIVE沉浸式材质,需要设备支持
NONE无材质效果

MaterialLevel(材质等级):

枚举值说明
ADAPTIVE系统自动选择
EXQUISITE精致效果
GENTLE柔和效果
SMOOTH平滑效果

如果选择自定义级别,建议先用hdsMaterial.getSystemMaterialTypes()检测设备能力,不支持IMMERSIVE时降级为SMOOTH


六、注意事项

  1. 最低版本要求systemMaterialEffect需要 API 23 (HarmonyOS 6.1.0) 及以上版本才生效。我们的代码中已有detectApi23FloatingNav()做版本检测,低版本会走LegacyMobileTabs()兜底,无需额外处理。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 12:32:29

抖音批量下载终极指南:如何高效保存无水印视频和原声音乐

抖音批量下载终极指南:如何高效保存无水印视频和原声音乐 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…

作者头像 李华
网站建设 2026/5/2 12:32:02

长期使用Taotoken聚合服务对项目运维复杂度的降低

长期使用Taotoken聚合服务对项目运维复杂度的降低 1. 统一接入层的核心价值 在持续数月的项目开发运维过程中,我们深刻体会到Taotoken作为大模型聚合分发平台的核心价值。通过OpenAI兼容的HTTP API,项目团队无需为每个上游模型供应商维护独立的SDK和认…

作者头像 李华
网站建设 2026/5/2 12:31:26

免费跨平台图表工具:draw.io桌面版终极使用指南

免费跨平台图表工具:draw.io桌面版终极使用指南 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 在当今数字化工作环境中,图表和流程图已成为团队协作、项…

作者头像 李华
网站建设 2026/5/2 12:30:48

如何快速掌握AI象棋分析:VinXiangQi智能助手完整使用指南

如何快速掌握AI象棋分析:VinXiangQi智能助手完整使用指南 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 想要在象棋对弈中获得AI级别的专业分…

作者头像 李华
网站建设 2026/5/2 12:24:52

桥式起重机小车运行机构设计(论文+DWG图纸)

桥式起重机小车运行机构是物料搬运系统的核心部件,其设计质量直接影响起重机的作业效率与安全性。该机构通过驱动装置带动小车沿主梁轨道往返移动,实现物料在车间内的水平运输。其核心作用在于精准控制小车启停、调速及定位,确保重物在吊运过…

作者头像 李华