本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、交互体系架构
ArkUI 交互系统
├── 基础输入事件(底层)
│ ├── 指向性事件(有位置信息)
│ └── 非指向性事件(无位置信息)
├── 手势系统(中层 - 事件组合识别)
└── 高级交互功能(上层)
├── 统一拖拽
└── 焦点切换等
二、基础输入事件分类
1. 指向性事件(有具体位置)
| 事件类型 | 触发设备 | 事件序列 | 派发目标 |
|---|---|---|---|
| 触摸事件 | 触摸屏 | Down → Move... → Up | 第一个Down命中的组件 |
| 鼠标事件 | 鼠标 | Down → Move... → Up | 第一个Down命中的组件 |
| 轴事件 | 滚轮/旋钮 | Begin → Update... → End | 第一个Begin命中的组件 |
特点:
-
有明确的位置坐标
-
系统保证完整事件序列给同一组件
-
以第一个开始事件命中的组件为派发目标
2. 非指向性事件(无具体位置)
| 事件类型 | 触发设备 | 事件状态 | 派发目标 |
|---|---|---|---|
| 按键事件 | 键盘 | Down(长按持续上报)→ Up | 当前焦点组件 |
| 表冠事件 | 手表旋钮 | - | 当前焦点组件 |
| 焦点轴事件 | - | - | 当前焦点组件 |
特点:
-
无位置信息,依赖特定操作
-
不保证完整事件序列(焦点可能变化)
-
以当前焦点组件为派发目标
三、事件序列特性
1. 完整序列事件(指向性事件)
// 触摸事件典型序列
Down → Move → Move → Move → ... → Up
// 轴事件典型序列
Begin → Update → Update → ... → End
-
系统保证开始到结束都由同一组件处理
2. 状态事件(非指向性事件)
// 按键事件
Down // 按下
[Down, Down, ...] // 长按持续上报
Up // 松开
-
只有 Down 和 Up 两种状态
-
长按时 Down 事件持续上报
四、手势系统
1. 手势是什么
-
一系列基础事件积累组合成的交互结果
-
示例:点击 = 按下 + 短时间抬起
2. 手势识别流程
用户操作
↓
产生基础事件序列
↓
手势识别器收集分析
↓
满足条件 → 识别为手势
↓
触发对应回调
3. 手势绑定规则
-
一个组件可绑定多个手势
-
手势来源:
-
组件内置默认绑定(如按钮的点击)
-
应用显式绑定(.gesture())
-
-
命中测试 收集所有可能手势
-
只有一个手势最终胜出并处理后续事件
4. 手势冲突处理
| 场景 | 解决方案 | 适用情况 |
|---|---|---|
| 非此即彼 | 互斥手势 | 需要明确选择一个手势 |
| 互不影响 | 并行手势 | 需要同时响应多个手势 |
| 动态决策 | 手势仲裁(onGestureJudgeBegin) | 需要运行时决定 |
五、高级交互
1. 统一拖拽
-
支持跨组件、跨应用的拖拽操作
-
统一的事件处理机制
2. 焦点切换
-
用于非指向性事件的派发目标确定
-
焦点变化影响事件接收组件
六、核心要点
1. 事件派发原则
-
指向性事件:看位置,第一个命中的组件接收
-
非指向性事件:看焦点,当前焦点组件接收
2. 手势竞争机制
-
用户按下时,收集所有可能手势
-
所有手势接收输入事件
-
一旦有手势满足条件,其他手势被排除
-
只有获胜手势继续处理后续事件
3. 开发建议
-
使用系统组件可自动获得手势支持
-
需要自定义交互时使用显式手势绑定
-
处理复杂手势关系时使用组合手势
-
需要动态控制时使用手势仲裁
ArkUI 交互从基础事件开始,指向性看位置,非指向性看焦点,手势是事件的智能组合,通过绑定和仲裁实现复杂交互。
1826




被折叠的 条评论
为什么被折叠?



