• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 事件分发
2
3## 概述
4
5ArkUI触控事件,根据输入源不同,主要划分为touch类与mouse类。
6
7touch类的输入源包含:finger、pen
8
9mouse类的输入源包含:mouse、touchpad、joystick
10
11由这两类输入源可以触发如下事件:
12
13| touch | mouse |
14|:-----:| ----- |
15| 触摸事件  | 触摸事件  |
16| 点击事件  | 鼠标事件  |
17| 拖拽事件  | 点击事件  |
18| 手势事件  | 拖拽事件  |
19|       | 手势事件  |
20
21无论是touch类事件还是mouse类事件,在ArkUI框架上均由触摸测试发起,触摸测试直接决定了ArkUI事件响应链的生成及事件的分发。
22
23## 触摸测试
24
25触摸测试指手指或者鼠标光标按下时,基于当前触点所在位置测试命中了哪些组件,并收集整个事件响应链的过程。
26
27如下是对触摸测试结果影响较大的几个因素:
28
29- TouchTest:触摸测试入口方法,此方法无外部接口
30
31- hitTestBehavior:触摸测试控制
32
33- interceptTouch:事件自定义拦截
34
35- responseRegion:触摸热区设置
36
37- enabled:禁用控制
38
39- 安全组件
40
41- 其他属性设置:透明度/组件下线
42
43### TouchTest
44
45- TouchTest的触发时机由每次点按的按下动作发起,默认由组件树的根节点TouchTest方法作为入口。
46
47- hitTestBehavior可以由InterceptTouch事件变更。
48
49- 触摸热区/禁用控制等不满足组件事件交互诉求,会导致立即返回父节点。
50
51  ![TouchTest](figures/TouchTest.png)
52
53### 触摸测试控制
54
55具体用法参考[触摸测试控制](../reference/apis-arkui/arkui-ts/ts-universal-attributes-hit-test-behavior.md)
56
57- 命中:触摸测试成功收集到当前组件/子组件的事件。
58
59- 子组件对父组件触摸测试的影响,取决于最后一个没有被阻塞触摸测试的子组件。
60
61- HitTestMode.Default:默认不配hitTestBehavior属性的效果,自身如果命中会阻塞兄弟组件,但是不阻塞子组件。
62
63  ![hitTestModeDefault](figures/hitTestModeDefault.png)
64
65- HitTestMode.None:自身不接收事件,但不会阻塞兄弟组件/子组件继续做触摸测试。
66
67  ![hitTestModeNone](figures/hitTestModeNone.png)
68
69- HitTestMode.Block:阻塞子组件的触摸测试,如果自身触摸测试命中,会阻塞兄弟组件及父组件的触摸测试。
70
71  ![hitTestModeBlock](figures/hitTestModeBlock.png)
72
73- HitTestMode.Transparent:自身进行触摸测试,同时不阻塞兄弟组件及父组件。
74
75  ![hitTestModeTransparent](figures/hitTestModeTransparent.png)
76
77### 自定义事件拦截
78
79[自定义事件拦截](../reference/apis-arkui/arkui-ts/ts-universal-attributes-on-touch-intercept.md)在按下触发时,可以根据业务状态动态改变组件的hitTestBehavior属性。
80
81### 禁用控制
82
83设置[禁用控制](../reference/apis-arkui/arkui-ts/ts-universal-attributes-enable.md)的组件,包括其子组件不会发起触摸测试过程,会直接返回父节点继续触摸测试。
84
85### 触摸热区设置
86
87[触摸热区设置](../reference/apis-arkui/arkui-ts/ts-universal-attributes-touch-target.md)会影响触屏/鼠标类的触摸测试,如果设置为0,或不可触控区域,则事件直接返回父节点继续触摸测试。
88
89### 安全组件
90
91ArkUI包含的安全组件有:[使用位置组件](../security/AccessToken/locationbutton.md)、[使用粘贴组件](../security/AccessToken/pastebutton.md)、[使用保存组件](../security/AccessToken/savebutton.md)等。
92
93安全组件当前对触摸测试影响:如果有组件的[z序](../reference/apis-arkui/arkui-ts/ts-universal-attributes-z-order.md)比安全组件的z序靠前,且遮盖安全组件,则安全组件事件直接返回到父节点继续触摸测试。
94
95## 事件响应链的收集
96
97ArkUI事件响应链收集,根据右子树(按组件布局的先后层级)优先的后序遍历流程,流程为:
98
99```
100foreach(item=>(node.rbegin(),node.rend(){
101    item.TouchTest()
102}
103node.collectEvent()
104```
105
106响应链收集举例,按下图的组件树,hitTestBehavior属性均为默认,用户点按的动作如果发生在组件5上,则最终收集到的响应链,以及先后关系是5,3,1。
107
108因为组件3的hitTestBehavior属性为Default,收集到事件后会阻塞兄弟节点,所以没有收集组件1的左子树。
109
110  ![EventResponseChain](figures/EventResponseChain.png)
111