HarmonyOS应用开发Navigation工具栏显隐技术
在HarmonyOS应用开发中,导航栏(Navigation)的工具栏(ToolBar)显隐控制是提升界面交互体验的核心能力。大家伙们跟着我这篇小文章一起深入了解一下工具栏显隐的实现原理、API特性、多版本适配策略,并结合一些实际开发案例看看吧。 咱们通过 关键特性: 鸿蒙6+新增动态显隐API: 鸿蒙5滴: 鸿蒙6+动态显隐: 场景需求:列表滚动时隐藏工具栏,静止时显示 场景需求:详情页固定显示工具栏 防抖处理: 状态缓存: 渲染优化: 显隐策略的选择: 注意一下下哦: 调试小技巧:一、小知识
二、核心知识点哦
2.1 基础显隐的控制
hideToolBar属性实现工具栏的显隐控制:// 基础显隐控制(鸿蒙5+)
Navigation() {
// 页面内容
}
.hideToolBar(true) // 隐藏工具栏false(显示工具栏)titleMode使用,当标题栏隐藏时工具栏自动隐藏2.2 动态显隐控制
// 动态显隐配置(鸿蒙6+)
.titleBar({
dynamicHide: {
hideToolBar: true, // 动态隐藏工具栏
triggerOffset: 100, // 触发偏移量(vp单位)
animation: {
duration: 300, // 动画的时长
curve: AnimationCurve.EaseOut
}
}
})三、多版本实现对比一下下
3.1 API差异来看看有些啥
特性 鸿蒙5实现 鸿蒙6+优化 显隐触发方式 手动设置 hideToolBar属性支持滚动/点击等事件触发动态显隐 状态保持 页面重建后恢复默认状态 通过 @State保持显隐状态动画效果 无 支持自定义动画曲线和时长 多页面同步 需手动逐层设置 通过导航控制器统一管理 3.2 代码实现对比看看
// 鸿蒙5静态显隐
Navigation() {
List() {
// 列表内容
}
}
.hideToolBar(true)
.titleMode(NavigationTitleMode.Mini)// 鸿蒙6+滚动显隐
@State isScrolling = false
Scroll() {
isScrolling = true
// 滚动监听逻辑
}
.navigation {
.titleBar({
dynamicHide: {
hideToolBar: this.isScrolling
}
})
}四、举些小例子
4.1 列表页工具栏显隐
@Entry
@Component
struct ListPage {
@State scrollOffset = 0
@State showToolbar = true
build() {
Navigation() {
Scroll() {
List({ space: 20 }) {
ForEach(0..50, (index) => {
ListItem() {
Text(`Item ${index}`)
.height(60)
}
})
}
.onScroll((offset) => {
this.scrollOffset = offset
this.showToolbar = offset === 0
})
}
}
.titleBar({
content: {
title: { mainTitle: "商品列表" },
toolBar: {
items: [
{ value: "筛选", icon: "filter" }
]
}
},
dynamicHide: {
hideToolBar: this.scrollOffset > 50
}
})
}
}4.2 详情页工具栏显隐
@Entry
@Component
struct DetailPage {
build() {
Navigation() {
Column() {
Image($r("app.media.product"))
.width("100%")
.height(300)
Text("商品详情")
.fontSize(24)
}
}
.hideToolBar(false) // 强制显示工具栏
.toolBar({
items: [
{ value: "收藏", icon: "heart" },
{ value: "分享", icon: "share" }
]
})
}
}五、多设备适配小技巧
5.1 屏幕方向适配
// 横屏隐藏工具栏
@MediaQuery(media: ScreenOrientation.Landscape)
.navigation {
.hideToolBar(true)
}5.2 系统版本适配
// 鸿蒙5兼容处理
if (version < 6) {
this.navigation.hideToolBar(true)
} else {
this.navigation.titleBar({
dynamicHide: { hideToolBar: true }
})
}六、一般的交互流程
七、性能优化小建议
.onScroll(debounce(200, (offset) => {
this.handleScroll(offset)
}))@Cacheable
private getToolbarState(): boolean {
return this.scrollOffset > 50
}@Link替代深层状态传递onScroll中执行高耗时操作八、总结一下下
build方法中频繁调用显隐方法@ohos.animator实现复杂滴动画