HarmonyOS 鸿蒙Next中屏幕朗读适配存在底层焦点的场景

HarmonyOS 鸿蒙Next中屏幕朗读适配存在底层焦点的场景

  • 定义:应用通过Stack布局或者类模态的方式把显示视图覆盖在原来的页面之上,仍可使用触摸或扫动方式聚焦原来页面的组件,这种现象就是存在底层焦点。
  • 示例 在屏幕朗读适配过程中,存在这种场景,在页面A拉起半模态页面B,在半模态页面上进行焦点走读过程,因为页面存在底层页面,导致在走焦过程中,焦点会回到页面A,这种场景不满足当前屏幕朗读适配场景,需要进行修复;

要修复这个问题,就要了解下accessibilityLevel。

accessibilityLevel

accessibilityLevel(value: string)

无障碍重要性。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

图片

修改方式:Stack布局或者类模态覆盖在原来的页面之上,应用可以通过设置底层页面根节点的accessibilityLevel为no-hide-descendants,Stack布局或者类模态关闭后accessibilityLevel再恢复成auto; 如果是完全覆盖,应用也可以设置底层页面根节点的visibility属性为None,Stack关闭后visibility再设置成Visible。

图示:

图片

1为底层界面的根节点,2为拉起的半模态页面。


更多关于HarmonyOS 鸿蒙Next中屏幕朗读适配存在底层焦点的场景的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

学到了,感谢楼主分享

更多关于HarmonyOS 鸿蒙Next中屏幕朗读适配存在底层焦点的场景的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,屏幕朗读适配底层焦点场景时,需确保所有可交互控件都正确设置了无障碍焦点属性。开发者应使用accessibilityConfig为组件配置accessibilityTextfocusable属性,确保焦点能按逻辑顺序移动。对于自定义组件,需通过accessibilityGroup管理焦点组,并使用accessibilityDelegate处理焦点事件。系统会自动处理部分原生控件的焦点,但复杂场景需手动调整焦点顺序和范围。

在HarmonyOS Next中,您描述的“底层焦点”问题确实是屏幕朗读(TalkBack)适配中的一个关键场景。您对问题的定义和示例非常准确。

针对此问题,您提出的解决方案方向是正确的。核心在于通过accessibilityLevel属性控制组件树对无障碍服务的暴露方式。

具体分析与操作建议:

  1. 问题根因:当半模态页面(如SheetModal等)或Stack布局覆盖在底层页面上时,虽然视觉上底层被遮挡,但其组件节点在无障碍树中默认仍然可见且可聚焦(accessibilityLevel默认为auto)。这导致屏幕朗读焦点会在顶层和底层组件间跳跃,造成逻辑混乱。

  2. 推荐解决方案:您提到的设置底层页面根节点accessibilityLevelno-hide-descendants是最佳实践。

    • 原理no-hide-descendants会强制让无障碍服务忽略该节点及其所有子节点,即使它们视觉上未被完全覆盖或设置了visibility。这从根本上切断了底层页面组件被屏幕朗读发现和聚焦的路径。
    • 操作
      • 在半模态页面显示时,将底层页面根容器(如ColumnStack)的.accessibilityLevel('no-hide-descendants')设置为。
      • 在半模态页面关闭时,将底层页面根容器的.accessibilityLevel('auto')恢复为。
  3. 备选方案:您提到的设置visibilityNone也是一种方法,但其副作用更大(会触发完整的布局重计算和渲染管线更新),可能影响性能和平滑度。通常优先推荐使用accessibilityLevel进行逻辑隐藏。

  4. 关键提醒

    • 作用域:务必在底层页面的根节点上设置,以确保其整个子树被屏蔽。
    • 状态管理:需要与半模态页面的显示/隐藏状态严格同步,确保accessibilityLevel值在正确时机切换,避免底层页面在恢复后仍无法被朗读。
    • 测试验证:修复后,务必在真机上开启屏幕朗读功能,通过触摸探索和滑动手势完整遍历焦点,确认焦点被完全限制在顶层半模态页面内。

您提供的图示清晰地展示了应修改的节点(底层界面根节点1),实践时遵循此路径即可有效解决底层焦点干扰问题。

回到顶部