HarmonyOS 鸿蒙Next进度条无障碍适配
HarmonyOS 鸿蒙Next进度条无障碍适配
想要做到焦点停留在进度条上时 每隔2s播报一次进度条进度,无障碍需要怎么适配,有案例吗,
已找到解决方案,需使用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属性,包括:
accessibilityLabel
定义语义标签;accessibilityHint
提供操作提示;accessibilityState
反映当前进度值。
进度变化时需触发accessibilityEvent
事件,辅助工具可获取实时进度。对于自定义进度条,必须通过accessibilityDelegate
实现无障碍接口,确保TalkBack能正确播报进度信息。
在HarmonyOS Next中实现进度条无障碍适配,可通过以下方式实现:
- 使用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);
}
- 在XML中配置重要无障碍属性:
<ProgressBar
android:id="@+id/progressBar"
android:importantForAccessibility="yes"
android:accessibilityLiveRegion="polite"
android:contentDescription="下载进度条"/>
- 确保在自定义视图中正确实现无障碍API:
- 重写onInitializeAccessibilityNodeInfo()方法
- 设置正确的AccessibilityNodeInfo属性
- 处理AccessibilityEvent事件
这种实现方式符合HarmonyOS Next的无障碍规范,能确保视障用户获得定期进度反馈。定时播报会在获得焦点时启动,失去焦点时自动停止。