鸿蒙开发日记:标题栏动态显隐——随滚动“呼吸”的「生命力」

52 阅读3分钟

在追求沉浸式体验的现代应用设计中,如何让导航组件智能地响应页面滚动,在需要时展现、在专注时隐藏?HarmonyOS 6.0.0(20) Beta1 为导航组件带来了全新的动态显隐能力,让标题栏、状态栏甚至自定义底部区域都能随用户操作优雅地“呼吸”。

一、 功能全景:精确控制每个区域的显现

这项能力让你可以精细控制导航组件的不同部分,实现三种层次的动态隐藏:

  • 隐藏标题区域:主标题和副标题区域可隐藏,释放更多内容空间
  • 隐藏状态栏:仅在标题区域已隐藏的前提下,状态栏才能随之隐藏
  • 隐藏底部构建器:可隐藏自定义的底部组件(如搜索框、工具栏)

这种分层控制机制确保了界面变化的合理性与连贯性,避免突兀的布局跳动。

二、 实现详解:四步完成动态显隐配置

第一步:模块导入

import { HdsNavigation, HdsNavigationAttribute, 
         BottomBuilderShowType, HideMode } from '@kit.UIDesignKit';

第二步:构建底部组件(可选) 如需控制底部区域的显隐,需要先创建一个自定义的底部构建器:

@Builder
BottomBuilder() {
  Column() {
    Search()  // 这里可以是任何自定义组件
      .placeholder('搜索内容...')
  }
  .width('100%')
  .height(56)
  .backgroundColor($r('sys.color.comp_background_tertiary'))
}

第三步:配置导航组件基础结构 创建 HdsNavigation 组件,并设置其标题栏和底部构建器:

@Entry
@Component
struct SmartNavigationPage {
  @State currentOffset: number = 0
  
  build() {
    HdsNavigation() {
      // 页面主体内容,必须是可滚动组件
      Scroll() {
        // 你的页面内容
        Column() {
          // 内容区域
        }
        .onScrollFrameBegin((offset: number) => {
          // 监听滚动位置,用于其他业务逻辑
          this.currentOffset = offset
        })
      }
    }
    .titleBar({
      content: {
        title: { 
          mainTitle: '智慧生活', 
          subTitle: '探索全新体验' 
        },
        // 配置底部构建器
        bottomBuilder: { 
          builder: (): void => this.BottomBuilder(), 
          height: 56, 
          showType: BottomBuilderShowType.DIRECTLY_SHOW 
        }
      }
    })
  }
}

第四步:启用动态显隐功能 通过 dynamicHideTitleBar 方法,精确控制各个区域的显隐行为:

.dynamicHideTitleBar({
  hideTitleArea: true,       // 启用标题区域隐藏
  hideBottomBuilder: true,   // 启用底部构建器隐藏
  hideStatusBar: false,      // 是否隐藏状态栏(需hideTitleArea为true)
  mode: HideMode.SCROLL_UP_TO, // 隐藏触发模式
  hideOffset: 10             // 开始隐藏的滚动距离(单位:vp)
})

三、 核心参数深度解析

1. 隐藏模式(HideMode) 当前文档展示的是 SCROLL_UP_TO 模式,即向上滚动达到指定距离时隐藏。系统可能还支持其他模式,如:

  • SCROLL_DOWN_TO:向下滚动显示
  • AUTO:根据滚动方向自动判断

2. 隐藏偏移量(hideOffset) 这个参数定义了触发隐藏的临界点:

  • 向上滚动距离 ≥ 10vp:开始执行隐藏动画
  • 向上滚动距离 < 10vp:保持显示状态
  • 反向滚动:执行显示动画

3. 状态栏隐藏条件 hideStatusBar 仅在 hideTitleAreatrue 时才生效,这种依赖关系确保了:

  • 状态栏不会单独隐藏,避免界面断层
  • 视觉变化符合用户认知习惯

四、 实战技巧与最佳实践

技巧1:与动态模糊样式结合使用

// 结合前文的动态模糊,创造更丰富的视觉效果
.titleBar({
  style: {
    scrollEffectOpts: {
      enableScrollEffect: true,
      scrollEffectType: ScrollEffectType.COMMON_BLUR,
      blurEffectiveEndOffset: LengthMetrics.vp(20)
    }
    // ... originalStyle 和 scrollEffectStyle 配置
  }
})
.dynamicHideTitleBar({
  hideTitleArea: true,
  hideOffset: 30,  // 模糊完成后再开始隐藏
  mode: HideMode.SCROLL_UP_TO
})

技巧2:智能显示控制逻辑

// 根据内容类型决定是否启用动态显隐
.dynamicHideTitleBar(this.shouldEnableDynamicHide() ? {
  hideTitleArea: true,
  hideOffset: 15,
  mode: HideMode.SCROLL_UP_TO
} : undefined)

// 判断函数示例
shouldEnableDynamicHide(): boolean {
  // 长文章页面启用,短表单页面禁用
  return this.contentType === 'article' && this.contentLength > 1000
}

技巧3:平滑过渡动画优化

// 监听显隐状态变化,添加自定义过渡效果
.onTitleBarVisibilityChange((visible: boolean) => {
  if (!visible) {
    // 标题栏隐藏时,可适当上移关键操作按钮
    this.adjustFloatingActionButton(true)
  } else {
    // 标题栏显示时,恢复按钮位置
    this.adjustFloatingActionButton(false)
  }
})

五、 常见问题与调试建议

Q1:为什么状态栏没有隐藏?

  • 检查 hideTitleArea 是否为 true(前提条件)
  • 确认设备系统版本 ≥ 6.0.0(20) Beta1
  • 检查是否有其他样式覆盖了状态栏设置

Q2:隐藏动画不流畅怎么办?

  • 确保页面滚动组件(Scroll/List)性能优化良好
  • 检查 hideOffset 值是否过小(建议≥10vp)
  • 避免在滚动过程中执行重计算操作

Q3:如何调试显隐边界?

// 添加调试信息
Scroll() {
  Column() {
    // 内容
  }
  .onScrollFrameBegin((offset: number) => {
    console.log(`当前滚动偏移: ${offset}vp`)
    console.log(`隐藏临界点: 10vp`)
    console.log(`标题栏应${offset >= 10 ? '隐藏' : '显示'}`)
  })
}

六、 设计理念与用户体验

1. 渐进式信息呈现 动态显隐不是简单的显示/隐藏切换,而是一种信息优先级管理策略:

  • 用户开始滚动 → 表明关注内容 → 逐渐隐藏导航元素
  • 用户停止滚动 → 可能需要操作 → 逐渐显示导航元素

2. 减少视觉干扰 在阅读长文、浏览图片等深度消费场景中,隐藏导航栏可以:

  • 增加10%-15%的有效内容区域
  • 降低视觉元素复杂度
  • 提升用户专注度

3. 保持操作可达性 即使导航栏隐藏,关键操作(如返回、搜索)仍可通过手势或浮动按钮访问,确保功能完整性。

七、 完整示例代码

import { HdsNavigation, BottomBuilderShowType, HideMode } from '@kit.UIDesignKit';

@Entry
@Component
struct ArticleReaderPage {
  @State articleContent: string = ''
  
  @Builder
  ArticleToolbar() {
    Row() {
      Button('收藏').width(80)
      Button('分享').width(80)
      Button('设置').width(80)
    }
    .width('100%')
    .height(48)
    .justifyContent(FlexAlign.SpaceEvenly)
  }

  build() {
    HdsNavigation() {
      Scroll() {
        Text(this.articleContent)
          .fontSize(16)
          .lineHeight(24)
          .padding(20)
      }
    }
    .titleBar({
      content: {
        title: { mainTitle: '深度好文' },
        bottomBuilder: {
          builder: (): void => this.ArticleToolbar(),
          height: 48,
          showType: BottomBuilderShowType.DIRECTLY_SHOW
        }
      }
    })
    .dynamicHideTitleBar({
      hideTitleArea: true,
      hideBottomBuilder: true,
      hideStatusBar: false,
      mode: HideMode.SCROLL_UP_TO,
      hideOffset: 12
    })
  }
}

八、 总结

HarmonyOS 6.0 的导航栏动态显隐功能,代表了现代移动 UI 设计的先进理念:界面应智能适应用户意图,而非静态存在。通过简单的配置,开发者就能实现以往需要复杂自定义代码才能完成的效果。

核心价值回顾:

  1. 声明式配置:几行代码开启高级交互效果
  2. 精细控制:分层管理不同导航区域的显隐
  3. 原生性能:系统级支持,动画流畅无卡顿
  4. 设计一致:符合 HarmonyOS 设计语言规范

建议在设计内容消费型、媒体浏览型或需要长时间专注的应用时,优先考虑使用此功能。它不仅提升了产品的视觉格调,更重要的是创造了更人性化、更专注的用户体验。

现在就开始,让你的应用导航栏学会“呼吸”,随用户的操作节奏优雅律动。

欢迎大家加入我们的班级一起学习:developer.huawei.com/consumer/cn…