在传统应用开发中,适老化改造通常只是加一个“大字版”开关,把字体调大、按钮拉宽。但这种做法有两个痛点:一是用户每装一个新应用都得重新找设置;二是应用内简单放大字体,很容易破坏原有UI布局,出现截断和错位。HarmonyOS 7.0(26.0.0 Beta1)在Accessibility Kit中引入了系统级关怀模式,底层渲染引擎与无障碍服务引擎深度协同,应用无需重写样式表,只需接入对应API,即可获得字体的无损缩放、无障碍焦点高亮以及屏幕朗读优先级调整。本文以一个“长辈新闻阅读器”页面为例,演示如何接入这套能力,并总结企业级适配时容易踩的坑。
一、Accessibility Kit交互架构的变化
在关怀模式下,ArkUI层拦截并接管了大部分渲染重构工作。开发者要做的是监听系统状态变更,并在少数复杂自定义组件上补充无障碍语义。这意味着大部分常规Text、Button、List组件,系统会自动处理缩放和朗读逻辑,不需要逐个手动适配。
二、监听并动态响应关怀模式
在应用入口或对应页面中,需要引入accessibility模块,通过响应式状态变量感知系统是否处于关怀模式。HarmonyOS 7.0优化了同步获取接口,可以直接查询当前状态,避免异步等待导致首屏闪烁。
- // ElderNewsPage.ets
- import { accessibility } from '@kit.AccessibilityKit';
- import { hilog } from '@kit.PerformanceAnalysisKit';
- @Entry
- @Component
- struct ElderNewsPage {
- // 响应式状态变量,感知系统是否开启关怀模式
- @State isCareModeEnabled: boolean = false;
- aboutToAppear() {
- // 同步获取当前系统无障碍/关怀模式状态(7.0优化接口)
- let isEnabled = accessibility.isOpenAccessibilitySync();
- this.isCareModeEnabled = isEnabled;
- hilog.info(0x0000, 'CareMode', '首屏加载,当前关怀模式状态:%{public}d', this.isCareModeEnabled ? 1 : 0);
- // 注册状态变更监听,老人从控制中心切换模式时能立刻感知并触发重绘
- accessibility.on('accessibilityStateChange', (state: boolean) => {
- hilog.info(0x0000, 'CareMode', '系统关怀模式状态发生切换:%{public}d', state ? 1 : 0);
- this.isCareModeEnabled = state;
- });
- }
- aboutToDisappear() {
- // 页面销毁时注销监听,防止内存泄漏
- accessibility.off('accessibilityStateChange');
- }
- build() {
- Column() {
- // 新闻标题
- Text('今日重点:HarmonyOS 7.0 发布')
- .fontSize(24)
- .fontWeight(FontWeight.Bold)
- .margin({ bottom: 20 })
- .accessibilityGroup(true)
- .accessibilityRole(accessibility.AccessibilityRole.HEADING)
- // 新闻正文区域,关怀模式下字体变大,外层必须使用Scroll或List保证可滚动
- Scroll() {
- Text('华为在今天的开发者大会上发布了 HarmonyOS 7.0,引入了全新的 AgentCard 和系统级关怀模式,将极大改善长辈的数字生活体验。')
- .fontSize(16)
- .fontColor('#333333')
- .lineHeight(this.isCareModeEnabled ? 32 : 24)
- }.height('60%')
- Blank()
- // 操作按钮:关怀模式下热区放宽,防止误触
- Button('分享给子女')
- .width(this.isCareModeEnabled ? '100%' : '60%')
- .height(this.isCareModeEnabled ? 64 : 48)
- .backgroundColor('#007DFF')
- .accessibilityText('将这篇新闻分享到微信给子女')
- .accessibilityDescription('点击后将拉起分享面板')
- .onClick(() => {
- hilog.info(0x0000, 'CareMode', '触发分享');
- })
- }
- .padding(20)
- .width('100%')
- .height('100%')
- }
- }
复制代码
这段代码展示了三个关键API用法:isOpenAccessibilitySync同步查询状态、on/off监听与注销、以及accessibilityText/Description为屏幕朗读提供完整语义。对于新闻正文,行高也会根据关怀模式状态动态调整,避免文字放大后挤在一起。
三、企业级适配的三个“防坑”准则
在实际将这套能力推向百万级用户时,有三个原则值得特别留意。
第一,绝对禁止写死容器高度。关怀模式下,Text组件在布局引擎计算时占据的空间会暴涨。如果给外层Column或Row写死height(100),文字放大后必然出现上下切割的UI事故。正确做法是使用layoutWeight或ConstraintSize,让容器跟随内部子节点自适应撑开。
第二,活用accessibilityGroup减少播报噪音。列表项里如果包含图片、标签、标题,老人滑动焦点时如果屏幕朗读一次只读一个标签,体验非常割裂。需要在列表项外层Row或Column上标记.accessibilityGroup(true),并统一定义完整的accessibilityText,让系统将其视为一个整体焦点进行播报。
第三,图标按钮必须补充accessibilityText。只有图标没有文字的按钮,比如返回箭头、分享图标,若不配置无障碍属性,关怀模式的TTS会直接报出“未标记按钮”,让视障群体或长辈完全不知所措。
四、总结
HarmonyOS 7.0将Accessibility Kit的定位从“字体调整工具”提升到了“系统级UX治理体系”。开发者只需要少量代码,就能让应用在常规模式和关怀模式之间平滑切换。对于技术团队来说,关注底层Kit的能力演进,不只是为了减少适配工作量,更是为了让数字产品真正覆盖到每一个需要被关心的用户。 |