// 全局字体缩放工具(ArkTS 严格类型,无 any) // 用于老人端大字显示:存 preferences + AppStorage import { preferences } from '@kit.ArkData'; import { common } from '@kit.AbilityKit'; import { accessibility } from '@kit.AccessibilityKit'; const FONT_PREFS = 'FontPrefs'; const FONT_KEY = 'fontScale'; export type FontScaleLevel = 'system' | 'small' | 'normal' | 'large' | 'xlarge'; // 字体缩放选项 export interface FontScaleOption { level: FontScaleLevel; label: string; } // 各档位缩放倍数(system 表示跟随系统,用 fp 单位不额外缩放) export const FONT_SCALE_MAP: Record = { system: 1.0, small: 1.0, normal: 1.15, large: 1.5, xlarge: 1.9, }; // 档位中文名 export const FONT_SCALE_LABELS: Array = [ { level: 'system', label: '跟随系统' }, { level: 'small', label: '小' }, { level: 'normal', label: '标准' }, { level: 'large', label: '大' }, { level: 'xlarge', label: '特大' }, ]; // 读取当前缩放档位(默认跟随系统) export async function loadFontScale(context: common.UIAbilityContext): Promise { try { const prefs = await preferences.getPreferences(context, FONT_PREFS); const value = await prefs.get(FONT_KEY, 'system'); const level = typeof value === 'string' ? value as FontScaleLevel : 'system'; AppStorage.setOrCreate('fontScale', level); return level; } catch (err) { return 'system'; } } // 设置缩放档位并持久化 export async function setFontScale(context: common.UIAbilityContext, level: FontScaleLevel): Promise { try { const prefs = await preferences.getPreferences(context, FONT_PREFS); await prefs.put(FONT_KEY, level); await prefs.flush(); } catch (err) { // ignore } AppStorage.setOrCreate('fontScale', level); } // 获取当前缩放倍数(同步,供页面文字应用) export function getFontScale(): number { const level = AppStorage.get('fontScale'); if (level && FONT_SCALE_MAP[level]) { return FONT_SCALE_MAP[level]; } return 1.0; } // 退出登录时恢复运行时字体为跟随系统(不清除持久化设置,老人重新登录后自动恢复) export function resetFontScaleRuntime(): void { AppStorage.setOrCreate('fontScale', 'system'); } // 关怀模式:系统无障碍(读屏/TalkBack 类)开启时自动生效 // 初始化在 EntryAbility.onCreate 调用;组件用 @StorageProp('careMode') 响应 export function refreshCareMode(): boolean { let care = false; try { care = accessibility.isOpenAccessibilitySync(); } catch (err) { care = false; } AppStorage.setOrCreate('careMode', care); return care; } // 关怀模式额外字号加成倍数(在 FONT_SCALE_MAP 之上再乘) export const CARE_MODE_EXTRA_SCALE = 1.2;