• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 触摸事件
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @jiangtao92-->
5<!--Designer: @piggyguy-->
6<!--Tester: @songyanhong-->
7<!--Adviser: @HelloCrease-->
8
9由手指在组件上按下、滑动或抬起时触发。
10
11> **说明:**
12>
13> 从API version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
14>
15> 事件分发可参考[事件交互流程](../../../ui/arkts-interaction-basic-principles.md#事件交互流程),手势事件处理流程可参考[多层级手势事件](../../../ui/arkts-gesture-events-multi-level-gesture.md)。
16>
17> 如需绑定手势事件可参考[绑定手势方法](./ts-gesture-settings.md)。
18
19## onTouch
20
21onTouch(event: (event: TouchEvent) => void): T
22
23手指触摸动作触发该回调。触摸事件默认[冒泡](../../../ui/arkts-interaction-basic-principles.md#事件冒泡),会被多个组件消费,如果需阻止冒泡,可参考[TouchEvent](#touchevent对象说明)的stopPropagation方法。鼠标左键按下时,对应的事件也会转换成触摸事件并触发该回调。
24
25**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
26
27**系统能力:** SystemCapability.ArkUI.ArkUI.Full
28
29**参数:**
30
31| 参数名 | 类型                              | 必填 | 说明                 |
32| ------ | --------------------------------- | ---- | -------------------- |
33| event  | [TouchEvent](#touchevent对象说明) | 是   | 获得TouchEvent对象。 |
34
35**返回值:**
36
37| 类型 | 说明 |
38| -------- | -------- |
39| T | 返回当前组件。 |
40
41## TouchEvent对象说明
42
43继承于[BaseEvent](ts-gesture-customize-judge.md#baseevent8)。在非事件注入场景下,changedTouches是按屏幕刷新率重采样的点,而touches是按器件刷新率上报的点,因此changedTouches与touches的数据可能不同。
44
45**系统能力:** SystemCapability.ArkUI.ArkUI.Full
46
47| 名称                | 类型       | 只读 | 可选   | 说明                        |
48| ------------------- | -----------|------|-------- | -------------------------- |
49| type                | [TouchType](ts-appendix-enums.md#touchtype)      | 否 | 否 | 触摸事件的类型。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。     |
50| touches             | &lt;[TouchObject](#touchobject)&gt;[] | 否 | 否 | 全部屏幕触点(多指)的信息,每个元素代表一个触点。在使用该属性时,需要校验是否为空。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。      |
51| changedTouches      | &lt;[TouchObject](#touchobject)&gt;[] | 否 | 否 | 发生变化而产生事件的手指信息。在使用该属性时,需要校验是否为空。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
52| stopPropagation      | () => void | 否 | 否 | 阻塞[事件冒泡](../../../ui/arkts-interaction-basic-principles.md#事件冒泡)。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
53| preventDefault<sup>12+</sup>      | () => void | 否 | 否 |  阻止默认事件。<br/> **说明:** 该接口仅支持部分组件使用,当前支持组件:Hyperlink,不支持的组件在使用时会抛出异常。暂不支持异步调用和提供Modifier接口。<br/> **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
54
55**错误码:**
56
57以下错误码的详细介绍请参见[交互事件错误码](../errorcode-event.md)。
58
59| 错误码ID   | 错误信息 |
60| --------- | ------- |
61| 100017       | Component does not support prevent function. |
62
63### getHistoricalPoints<sup>10+</sup>
64
65getHistoricalPoints(): Array&lt;HistoricalPoint&gt;
66
67获取当前帧的所有历史点。不同设备每帧的触摸事件频率不同,且该接口仅能在[TouchEvent](#touchevent对象说明)中调用,用于获取触发[onTouch](#ontouch)时当前帧历史点的相关信息。[onTouch](#ontouch)一帧通常只会调用一次,如果当前帧收到的[TouchEvent](#touchevent对象说明)数目大于1,会将该帧最后一个点通过[onTouch](#ontouch)返还,其余点作为历史点。如果多指在同一帧上报事件,可能触发多次onTouch。
68
69**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
70
71**系统能力:** SystemCapability.ArkUI.ArkUI.Full
72
73**返回值:**
74
75| 类型     | 说明                      |
76| ------ | ----------------------- |
77| Array&lt;[HistoricalPoint](#historicalpoint10对象说明)&gt; | 由历史点组成的数组。 |
78
79
80## TouchObject
81
82**系统能力:** SystemCapability.ArkUI.ArkUI.Full
83
84| 名称    | 类型                              | 只读 | 可选          | 说明                                  |
85| ------- | ----------------------------------|-----| -------------- | ------------------------------------- |
86| type    | [TouchType](ts-appendix-enums.md#touchtype) | 否 | 否 | 触摸事件的类型。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                      |
87| id      | number                                      | 否 | 否 | 手指唯一标识符。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                      |
88| x       | number                                      | 否 | 否 | 触摸点相对于事件响应组件左上角的X坐标。<br/>单位:vp<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
89| y       | number                                      | 否 | 否 | 触摸点相对于事件响应组件左上角的Y坐标。<br/>单位:vp<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
90| windowX<sup>10+</sup>  | number                       | 否 | 否 | 触摸点相对于应用窗口左上角的X坐标。<br/>单位:vp<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。   |
91| windowY<sup>10+</sup>  | number                       | 否 | 否 | 触摸点相对于应用窗口左上角的Y坐标。<br/>单位:vp<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。   |
92| displayX<sup>10+</sup> | number                       | 否 | 否 | 触摸点相对于应用屏幕左上角的X坐标。<br/>单位:vp<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。   |
93| displayY<sup>10+</sup> | number                       | 否 | 否 | 触摸点相对于应用屏幕左上角的Y坐标。<br/>单位:vp<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。   |
94| screenX<sup>(deprecated)</sup> | number               | 否 | 否 | 触摸点相对于应用窗口左上角的X坐标。<br/>单位:vp <br>从API version 10开始不再维护,建议使用windowX代替。   |
95| screenY<sup>(deprecated)</sup> | number               | 否 | 否 | 触摸点相对于应用窗口左上角的Y坐标。<br/>单位:vp <br>从API version 10开始不再维护,建议使用windowY代替。   |
96| pressedTime<sup>15+</sup> | number | 否 | 是 | 当前手指按下的时间。<br>单位:ns<br />**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 |
97| pressure<sup>15+</sup> | number | 否 | 是 | 当前手指按压的压力值。<br/>取值范围:[0,65535),压力越大,值越大。<br />**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 |
98| width<sup>15+</sup> | number | 否 | 是 | 当前手指按压区域的宽度。<br />单位:vp<br/>**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 |
99| height<sup>15+</sup> | number | 否 | 是 | 当前手指按压区域的高度。<br />单位:vp<br/>**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 |
100| hand<sup>15+</sup> | [InteractionHand](./ts-appendix-enums.md#interactionhand15) | 否 | 是 | 表示事件是由左手点击还是右手点击触发。<br />**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。 |
101| globalDisplayX<sup>20+</sup> | number | 否 | 是 | 触摸点位置相对于全局屏幕左上角的X坐标。<br/>单位:vp<br/>取值范围:[0, +∞)<br/>**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。 |
102| globalDisplayY<sup>20+</sup> | number | 否 | 是 | 触摸点位置相对于全局屏幕左上角的Y坐标。<br/>单位:vp<br/>取值范围:[0, +∞)<br/>**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。 |
103
104## HistoricalPoint<sup>10+</sup>对象说明
105
106历史点信息。
107
108**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
109
110**系统能力:** SystemCapability.ArkUI.ArkUI.Full
111
112| 名称         | 类型                        | 只读 | 可选       | 说明                                                                         |
113| ----------- | -----------------------------|------ | ----------|------------------------------------------------------------------- |
114| touchObject | [TouchObject](#touchobject)  | 否 | 否 | 历史点对应触摸事件的基础信息。                                                   |
115| size        | number                              | 否 | 否 | 历史点对应触摸事件中手指与屏幕的触摸区域大小。<br/>默认值:0                                     |
116| force       | number                              | 否 | 否 | 历史点对应触摸事件的压力大小。<br/>默认值:0<br/>取值范围:[0,65535),压力越大,值越大。|
117| timestamp   | number                              | 否 | 否 | 历史点对应触摸事件的时间戳,表示触发事件时距离系统启动的时间间隔。<br>单位:ns           |
118
119## 示例
120
121该示例中,按钮设置触摸事件,在点击按钮时可获取事件的相关参数。
122
123```ts
124// xxx.ets
125@Entry
126@Component
127struct TouchExample {
128  @State text: string = '';
129  @State eventType: string = '';
130
131  build() {
132    Column() {
133      Button('Touch').height(40).width(100)
134        .onTouch((event?: TouchEvent) => {
135          if (event && event.sourceTool === SourceTool.Finger) {
136            if (event.type === TouchType.Down) {
137              this.eventType = 'Down';
138            }
139            if (event.type === TouchType.Up) {
140              this.eventType = 'Up';
141            }
142            if (event.type === TouchType.Move) {
143              this.eventType = 'Move';
144            }
145            // 1.手指按住屏幕同时点击Home键返回桌面,此时会触发Cancel
146            // 2.折叠屏手机,应用在按住屏幕的情况下折叠手机切换到外屏,此时会触发Cancel
147            if (event.type === TouchType.Cancel) {
148              this.eventType = 'Cancel';
149            }
150            if (event.touches) {
151              this.text = 'TouchType:' + this.eventType
152                + '\nDistance between touch point and touch element:'
153                + '\n  x: ' + event.touches[0].x + '\n  y: ' + event.touches[0].y
154                + '\n  width: ' + event.touches[0].width + '\n  height: ' + event.touches[0].height
155                + '\n  pressedTime: ' + event.touches[0].pressedTime
156                + '\n  pressure: ' + event.touches[0].pressure
157                + '\nComponent globalPos:'
158                + '\n  x: ' + event.target.area.globalPosition.x + '\n  y: ' + event.target.area.globalPosition.y
159                + '\n  width: ' + event.target.area.width + '\n  height: ' + event.target.area.height
160                + '\ntargetDisplayId: ' + event.targetDisplayId;
161            }
162          }
163        })
164      Button('Touch').height(50).width(200).margin(20)
165        .onTouch((event?: TouchEvent) => {
166          if (event) {
167            if (event.type === TouchType.Down) {
168              this.eventType = 'Down';
169            }
170            if (event.type === TouchType.Up) {
171              this.eventType = 'Up';
172            }
173            if (event.type === TouchType.Move) {
174              this.eventType = 'Move';
175            }
176            // 1.手指按住屏幕同时点击Home键返回桌面,此时会触发Cancel
177            // 2.折叠屏手机,应用在按住屏幕的情况下折叠手机切换到外屏,此时会触发Cancel
178            if (event.type === TouchType.Cancel) {
179              this.eventType = 'Cancel';
180            }
181            if (event.touches) {
182              this.text = 'TouchType:' + this.eventType
183                + '\nDistance between touch point and touch element:'
184                + '\n  x: ' + event.touches[0].x + '\n  y: ' + event.touches[0].y
185                + '\n  width: ' + event.touches[0].width + '\n  height: ' + event.touches[0].height
186                + '\n  pressedTime: ' + event.touches[0].pressedTime
187                + '\n  pressure: ' + event.touches[0].pressure
188                + '\nComponent globalPos:'
189                + '\n  x: ' + event.target.area.globalPosition.x + '\n  y: ' + event.target.area.globalPosition.y
190                + '\n  width: ' + event.target.area.width + '\n  height: ' + event.target.area.height
191                + '\ntargetDisplayId: ' + event.targetDisplayId;
192            }
193          }
194        })
195      Text(this.text)
196    }.width('100%').padding(30)
197  }
198}
199```
200
201![touch](figures/touch.gif)