HarmonyKit | 鸿蒙新特性:HdsTabs 沉浸光感底部导航完全指南

HarmonyKit | 鸿蒙新特性:HdsTabs 沉浸光感底部导航完全指南

背景:Tabs 的三次进化

HarmonyKit 的底部导航经历了三个阶段,每个阶段都解决了一个具体问题。

阶段一:基础 Tabs。 项目初期使用了最基础的 Tabs 组件。功能完整------标签切换、内容区跟随、bar 位置可配。但视觉效果非常原始:底部栏是一个纯色矩形条,与内容区之间有生硬的分割线。这是"能用"的阶段。

阶段二:自定义毛玻璃。 不满意基础 Tabs 的视觉效果,我用 Stack 叠加了一个自定义底部导航栏。底部栏使用了 backdropBlur(20) 实现毛玻璃模糊,配合 rgba(255,255,255,0.72) 的半透明白色背景,让滚动的内容在底部栏下方"渗透"过来。同时用线性渐变(#5856d6 → #007aff)给了选中项一个胶囊形高亮。

这个方案视觉效果很好,但有一个致命问题:它完全手动维护了 Tab 切换状态。currentIndex 通过 onClick 手动更新,没有与 TabContent 同步。当用户滑动切换 Tab 时,自定义的底部栏不会跟随更新。而且这个方案约 80 行额外代码全部在 Index.ets 中,与页面逻辑耦合。

阶段三:HdsTabs 沉浸光感。 阅读了鸿蒙官方"沉浸光感"文档后,发现 HdsTabs 原生支持了我手动实现的一切------毛玻璃材质、悬浮胶囊、手势跟随------而且代码量只相当于阶段二的 20%。

项目仓库:https://atomgit.com/VON-/harmony-kit

HdsTabs 的完整配置

HarmonyKit 的最终实现如下:

typescript 复制代码
import { hdsMaterial, HdsTabs, HdsTabsController } from '@kit.UIDesignKit';

private controller: HdsTabsController = new HdsTabsController();

HdsTabs({ controller: this.controller }) {
  ForEach(CATEGORIES, (cat: string) => {
    TabContent() {
      this.ToolGrid(cat)
    }
    .tabBar(cat)
  })
}
.barOverlap(true)
.vertical(false)
.barPosition(BarPosition.End)
.barFloatingStyle({
  barBottomMargin: 36,
  adaptToHandedness: true,
  systemMaterialEffect: {
    materialType: hdsMaterial.MaterialType.ADAPTIVE,
    materialLevel: hdsMaterial.MaterialLevel.ADAPTIVE
  }
})

这 7 个链式属性构成了完整的沉浸式底部导航。逐个拆解:

barOverlap(true)

这是最关键的单一属性。它改变了 Tabs 内容的布局区域------内容区不再"止步于"导航栏之上,而是扩展到屏幕底部,导航栏以浮层形式覆盖在内容之上。

效果是:当用户滚动工具网格时,网格底部会自然地"穿过"导航栏,产生内容在导航栏下方流动的视觉效果。配合毛玻璃模糊,层次感瞬间建立。

barPosition(BarPosition.End)

位置选项只有两个:Start(顶部)和 End(底部)。对于移动端导航,底部是标准做法------拇指最容易触及的区域。

barFloatingStyle

这是悬浮胶囊的核心配置入口。

barBottomMargin: 36 让导航栏向上浮动 36vp,在导航栏和屏幕底部之间形成一个间距。这个间距不仅是视觉上的"呼吸感",还为系统导航条(手势指示条)留出了安全的点击区域。

adaptToHandedness: true 是鸿蒙独有的"智感握姿"特性。在宽屏设备上(平板、折叠屏展开态),系统会感知用户的握持手,将底部导航栏的中心点向握持手方向偏移。右撇子用户看到导航栏略微偏右,左撇子用户看到略微偏左。不需要开发者写任何手势识别代码------HDS 框架层做了全部工作。

systemMaterialEffect

这是沉浸光感的核心引擎。两个 ADAPTIVE 参数让系统在"视觉效果"和"设备性能"之间自动平衡:

  • materialType: ADAPTIVE:系统决定使用什么类型的材质(毛玻璃、渐变、纯色等)
  • materialLevel: ADAPTIVE:系统根据设备算力选择效果强度(强/均衡/弱)

在 HarmonyKit 的测试设备上(中端手机),ADAPTIVE 模式自动选择了 GENTLE 档------适度的毛玻璃模糊 + 圆角阴影。在一台高端平板上测试时,系统自动升级到 EXQUISITE 档------更强的模糊半径、更细腻的光晕、更流畅的动效。

开发者不需要判断设备性能,不需要写降级逻辑,不需要管理多套样式。"ADAPTIVE" 两个字消除了所有这些决策。

HdsTabsController 的使用

typescript 复制代码
private controller: HdsTabsController = new HdsTabsController();

Controller 是 HdsTabs 的状态管理器。它提供了几个实用方法:

  • controller.changeIndex(n):程序化切换 Tab
  • controller.preloadItems([0,1,2]):预加载指定 Tab 内容
  • controller.getCurrentIndex():获取当前 Tab 索引

HarmonyKit 中使用了 controller 但通过 onChange 回调同步 currentIndex

typescript 复制代码
.onChange((index: number) => {
  this.currentIndex = index;
})

与基础 Tabs 的全面对比

维度 基础 Tabs HdsTabs
悬浮效果 不支持,需 Stack 模拟 barOverlap(true) 一行
毛玻璃材质 backdropBlur() 手动调参 systemMaterialEffect 内置
圆角胶囊 需自定义 @Builder barFloatingStyle 自动
手势跟随 不支持 adaptToHandedness
性能适配 需手动检测设备 ADAPTIVE 自动分级
MiniBar 不支持 miniBar builder 配置
API 稳定性 基本稳定 部分属性 SDK 6.1.0+
自定义灵活性 高(TabBuilder 全控制) 低(仅支持字符串 tabBar)

一个选择建议

如果你正在犹豫用 Tabs 还是 HdsTabs,回答一个问题就够:你需要设计规范的自动跟随吗?

需要 → HdsTabs。底部的悬浮胶囊形态、圆角半径、间距、阴影层级------这些细节如果每次都要自己调,工作量巨大且不容易做好。HdsTabs 保证了这些细节与系统设计规范一致,随系统版本更新自动演进。

不需要(你有自己的设计稿,且设计稿与 HDS 规范不同)→ Tabs。HdsTabs 的自定义空间很有限------你只能用字符串作为 tabBar 标签,不能完全自定义标签栏的渲染。如果你的设计稿要求竖排标签、图标+文字组合、或者非矩形的指示器------那只能用基础 Tabs + 自定义 @Builder

HarmonyKit 选择了 HdsTabs,因为我们的设计目标是"融入系统"而非"标新立异"。工具应用应该把注意力留给工具本身,而不是花哨的导航样式。

常见问题

Q: HdsTabs 的 barFloatingStyle 报 SDK 版本警告怎么办?

这是最常见的 HdsTabs 使用问题。barFloatingStylesystemMaterialEffect 需要 SDK 6.1.0(23) 以上。如果你的 DevEco Studio 的 SDK 是 6.0.2(22),编译器会报 warning 但代码可以编译通过。运行时效果在 6.0.2 上会降级为基础样式(无模糊、无悬浮)。

解决方案:升级 DevEco Studio 到支持 SDK 6.1+ 的版本,或将 compatibleSdkVersion 保持为 6.0.2 以兼容更多设备,接受降级效果。

Q: 如何自定义 tabBar 标签的样式?

当前 HdsTabs 的 .tabBar() 方法接受字符串或简单的样式配置。如果需要复杂的自定义标签,考虑使用基础 Tabs + @Builder 自定义 TabBuilder

项目仓库:https://atomgit.com/VON-/harmony-kit

相关推荐
我是小a2 小时前
鸿蒙 ArkUI 数据可视化图例对照表:组件化设计与实现
华为·信息可视化·harmonyos·鸿蒙·鸿蒙系统
TrisighT2 小时前
Electron 鸿蒙 PC 上点关闭就真退出了?我花了两天才把“最小化到托盘“做稳
electron·harmonyos
在书中成长3 小时前
HarmonyOS 小游戏《对战五子棋》开发第2篇-AppScope与entry模块
华为·harmonyos
●VON4 小时前
HarmonyKit | 鸿蒙新特性对比:Tabs vs HdsTabs 选型深度解析
华为·harmonyos·鸿蒙·新特性
binbin_524 小时前
React Native 鸿蒙环境搭建完整实战:从 RN 工程到 RNOH 运行
深度学习·react native·react.js·harmonyos
最爱老式锅包肉4 小时前
《HarmonyOS技术精讲-Core Speech Kit(基础语音服务)》第1篇:音频管理基础与语音服务入门
华为·音视频·harmonyos
最爱老式锅包肉4 小时前
HarmonyOS技术精讲-Speech Kit(场景化语音服务):AI字幕控件赋能实时语音识别与显示
语音识别·harmonyos
千逐685 小时前
Uniapp 鸿蒙实战之 AtomGit APP - 首页设计与仓库列表实现
华为·uni-app·harmonyos
binbin_525 小时前
Flutter 调用鸿蒙原生组件:MethodChannel 与 PlatformView 的选择和落地
开发语言·深度学习·flutter·harmonyos