【HarmonyOS 7新能力|021】智慧手势入门实战:从能力边界到最小可运行链路
【HarmonyOS 7新能力021】智慧手势入门实战从能力边界到最小可运行链路智慧手势不是“检测到动作就执行命令”。同一个滑动、悬停或指向动作在不同页面状态下可能表达完全不同的意图。若应用忽略置信度、当前焦点和操作风险误识别就可能直接变成误删除、误发送或误支付。本文构建“采集手势信号—归一化动作—推断用户意图—评估操作风险—请求必要确认—执行并反馈”的最小链路。文中的类型、状态机和策略是应用侧教学封装不代表 HarmonyOS 7 官方 API具体手势能力、事件字段和设备范围应以当前 SDK 与华为官方文档为准。一、先把手势和意图分开手势是输入事实意图是结合上下文作出的推断。“向左滑”只能说明轨迹方向不能独立证明用户想删除内容。页面模式、起始区域、目标对象、动作速度和当前任务共同决定候选意图。第一版的验收重点不是覆盖更多手势而是低置信度不执行高风险动作必须确认页面状态变化后旧意图失效相同动作不会被重复消费能力不可用时保留按钮或菜单等常规入口。二、建立可测试的输入模型interface GestureSample { pointerId: number phase: start | move | end | cancel x: number y: number occurredAt: number } interface GestureContext { pageId: string targetId: string | null editable: boolean revision: number }输入模型不保存平台对象只保留推断需要的最小数据。坐标应先转换到统一空间时间戳必须单调可比较取消阶段要清除未完成轨迹。三、动作归一化不能依赖单点轨迹识别至少需要起点、终点、持续时间和有效移动距离。过短或采样异常的动作应返回未知而不是硬分配给最近的类别。type GestureKind tap | swipe-left | swipe-right | unknown function classify(start: GestureSample, end: GestureSample): GestureKind { const dx end.x - start.x const dy end.y - start.y const distance Math.hypot(dx, dy) if (distance 12) return tap if (Math.abs(dx) Math.abs(dy)) return unknown return dx 0 ? swipe-left : swipe-right }阈值仅用于展示结构正式参数需要依据目标设备、输入方式和无障碍场景验证。四、完整链路要有拒绝分支推断器输出候选意图与置信度安全策略再结合操作风险和最新页面状态决定执行、确认或拒绝。置信度不足、高风险动作没有确认、目标对象已经改变时正确结果就是不执行并给出轻量提示。type IntentName open | archive | delete | none interface IntentCandidate { name: IntentName confidence: number targetId: string | null contextRevision: number } function accepted(candidate: IntentCandidate, currentRevision: number): boolean { return candidate.name ! none candidate.confidence 0.8 candidate.contextRevision currentRevision }置信度阈值不能被描述成普遍标准应通过误触成本和真实数据校准。五、风险分级决定确认方式打开详情、切换标签等可逆动作可直接执行归档、发送等需要明显撤销入口删除、支付或权限变更等高风险动作应使用明确确认不应依赖一次模糊手势完成。type RiskLevel low | medium | high function riskOf(intent: IntentName): RiskLevel { if (intent delete) return high if (intent archive) return medium return low } function needsConfirmation(intent: IntentName): boolean { return riskOf(intent) high }确认文案要说明对象和后果按钮顺序应避免把危险动作放在默认焦点位置。六、分层架构限制误操作传播交互层采集手势并展示确认与结果意图编排层负责动作归一化、置信度和状态校验安全策略层完成风险分级、二次确认与幂等控制平台适配层封装真实手势事件、窗口和生命周期。interface GestureAdapter { subscribe(listener: (sample: GestureSample) void): () void } interface IntentExecutor { execute(candidate: IntentCandidate, idempotencyKey: string): Promisevoid }业务执行器只接收通过策略审核的意图原始轨迹不能直接触达数据写入层。七、状态变化后旧意图必须失效用户完成手势后页面可能已经切换、目标被删除或列表重新排序。执行前应重新读取对象身份和页面修订号不能只相信手势开始时的引用。function sameTarget( candidate: IntentCandidate, context: GestureContext ): boolean { return candidate.contextRevision context.revision candidate.targetId context.targetId }弹出确认框后也要再次检查。确认不是延长旧状态的许可证而是用户对当前可见对象作出的决定。八、幂等与撤销是两道独立保护一次手势可能因事件重复、动画回调或网络重试触发多次。为每次明确意图生成幂等键执行层拒绝重复提交。中风险动作还应提供限时撤销但撤销不能代替幂等。class OnceGuard { private consumed: Setstring new Set() consume(key: string): boolean { if (this.consumed.has(key)) return false this.consumed.add(key) return true } }集合需要按生命周期或过期策略清理避免长期占用内存。九、无障碍和替代入口不能缺席手势不应成为唯一入口。每项能力都要保留可聚焦按钮、菜单或快捷操作让屏幕朗读、键盘、鼠标和运动能力受限的用户能够完成同一任务。扩大触控目标、避免只用颜色提示、为确认结果提供语义反馈并验证字体放大、横屏、小窗和大屏布局。系统返回或取消手势必须能退出未完成状态。十、生命周期与隐私边界页面不可见、窗口失焦或应用进入后台时应取消未完成轨迹并移除监听。除非业务明确需要不要长期保存原始轨迹分析数据也应最小化、去标识化并与隐私说明保持一致。class GestureSession { private stop: (() void) | null null attach(adapter: GestureAdapter, listener: (s: GestureSample) void): void { this.stop?.() this.stop adapter.subscribe(listener) } dispose(): void { this.stop?.() this.stop null } }十一、最小测试矩阵单击、左右滑动、短距离和取消动作分类稳定。低置信度动作不会写入业务数据。删除等高风险动作必须经过明确确认。目标变化、页面切换后旧候选意图失效。重复事件只执行一次中风险操作可以撤销。页面退出后监听与轨迹状态全部释放。按钮、键盘和屏幕朗读可完成同等任务。小窗、大屏、字体放大和深浅色模式下提示可读。十二、结语智慧手势的核心不是识别更多动作而是把不确定输入变成受控意图先归一化轨迹再结合上下文推断以风险策略决定确认方式执行前复核状态并用幂等、撤销和替代入口守住安全边界。只有拒绝路径同样完整手势体验才真正可靠。参考资料HarmonyOS 开发者能力介绍HarmonyOS 版本新特性说明