HarmonyOS 鸿蒙Next进度条无障碍适配

HarmonyOS 鸿蒙Next进度条无障碍适配

想要做到焦点停留在进度条上时 每隔2s播报一次进度条进度,无障碍需要怎么适配,有案例吗,

5 回复

已找到解决方案,需使用api18能力

onAccessibilityFocus() 组件获焦后开启定时器间隔2s播报一次,组件失焦后清除定时器

参考文档:无障碍控制操作-无障碍相关-通用事件-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者 (huawei.com)

更多关于HarmonyOS 鸿蒙Next进度条无障碍适配的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用accessibilityText为进度条提供朗读文本(如“播放进度50%”),accessibilityDescription补充详细说明(如“支持拖拽调节”)。

若进度条包含多个子元素(如时间标签、拖拽手柄),通过accessibilityGroup(true)将其组合为整体,避免屏幕阅读器逐项播报

参考地址: https://developer.huawei.com/consumer/cn/blog/topic/03186500002151204

楼主好,要实现进度条的无障碍适配,需结合焦点事件与定时器动态播报进度。

1—为进度条组件添加 accessibilityLabel(描述控件用途)和 accessibilityValue(动态进度值),确保读屏软件能识别当前进度;

2—监听进度条的焦点变化,焦点停留时启动定时器,失去焦点时清除定时器;

3—通过 setInterval 每隔 2 秒更新播报内容,并通过读屏 API 触发语音反馈

请参考完整代码:

import { Progress } from '@kit.ArkUI';

import { AccessibilityEventType } from '@kit.AccessibilityKit';

@Entry
@Component
struct ProgressBarExample {

  @State currentProgress: number = 30;

  private timer: number | null = null;

  // 启动定时器
  startTimer() {
    this.timer = setInterval(() => {
      sendAccessibilityEvent({
        text: `当前进度 ${this.currentProgress}%`,
        type: AccessibilityEventType.ANNOUNCEMENT
      });
    }, 2000);
  }

  // 清除定时器
  clearTimer() {
    if (this.timer !== null) {
      clearInterval(this.timer);
      this.timer = null;
    }
  }

  build() {
    Column() {
      Progress({ value: this.currentProgress })
        .width('80%')
        .accessibilityLabel('文件下载进度')
        .accessibilityValue(this.currentProgress + '%')
        .onFocus(() => { this.startTimer(); })
        .onBlur(() => { this.clearTimer(); })
    }
    .width('100%')
    .height('100%')
  }
}

鸿蒙Next进度条的无障碍适配主要基于Accessibility Kit实现。开发者需使用ArkUI的Progress组件,并设置accessibilityProperties属性,包括:

  1. accessibilityLabel定义语义标签;
  2. accessibilityHint提供操作提示;
  3. accessibilityState反映当前进度值。

进度变化时需触发accessibilityEvent事件,辅助工具可获取实时进度。对于自定义进度条,必须通过accessibilityDelegate实现无障碍接口,确保TalkBack能正确播报进度信息。

在HarmonyOS Next中实现进度条无障碍适配,可通过以下方式实现:

  1. 使用AccessibilityAbilityController设置自定义播报:
// 获取进度条的无障碍控制器
AccessibilityAbilityController controller = progressBar.getAccessibilityAbilityController();

// 设置自定义播报逻辑
controller.setAccessibilityDelegate(new AccessibilityDelegate() {
    @Override
    public void onAccessibilityFocus(View view) {
        // 焦点获取时启动定时播报
        startProgressAnnouncement();
    }

    @Override
    public void onAccessibilityFocusCleared(View view) {
        // 焦点移出时停止播报
        stopProgressAnnouncement();
    }
});

// 定时播报方法
private void startProgressAnnouncement() {
    Handler handler = new Handler();
    Runnable announcementRunnable = new Runnable() {
        @Override
        public void run() {
            int progress = progressBar.getProgress();
            String announcement = "当前进度:" + progress + "%";
            controller.sendAccessibilityEvent(
                AccessibilityEvent.TYPE_ANNOUNCEMENT,
                announcement
            );
            handler.postDelayed(this, 2000); // 2秒间隔
        }
    };
    handler.post(announcementRunnable);
}
  1. 在XML中配置重要无障碍属性:
<ProgressBar
    android:id="@+id/progressBar"
    android:importantForAccessibility="yes"
    android:accessibilityLiveRegion="polite"
    android:contentDescription="下载进度条"/>
  1. 确保在自定义视图中正确实现无障碍API:
  • 重写onInitializeAccessibilityNodeInfo()方法
  • 设置正确的AccessibilityNodeInfo属性
  • 处理AccessibilityEvent事件

这种实现方式符合HarmonyOS Next的无障碍规范,能确保视障用户获得定期进度反馈。定时播报会在获得焦点时启动,失去焦点时自动停止。

回到顶部