• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 触屏事件
2
3
4触屏事件指当手指/手写笔在组件上按下、滑动、抬起时触发的回调事件。包括[点击事件](#点击事件)、[拖拽事件](#拖拽事件)和[触摸事件](#触摸事件)。
5
6
7**图1**  触摸事件原理
8
9
10![zh-cn_image_0000001562700461](figures/zh-cn_image_0000001562700461.png)
11
12
13## 点击事件
14
15点击事件是指通过手指或手写笔做出一次完整的按下和抬起动作。当发生点击事件时,会触发以下回调函数:
16
17
18
19```ts
20onClick(event: (event?: ClickEvent) => void)
21```
22
23
24event参数提供点击事件相对于窗口或组件的坐标位置,以及发生点击的事件源。
25
26
27  例如通过按钮的点击事件控制图片的显示和隐藏。
28
29```ts
30@Entry
31@Component
32struct IfElseTransition {
33  @State flag: boolean = true;
34  @State btnMsg: string = 'show';
35
36  build() {
37    Column() {
38      Button(this.btnMsg).width(80).height(30).margin(30)
39        .onClick(() => {
40          if (this.flag) {
41            this.btnMsg = 'hide';
42          } else {
43            this.btnMsg = 'show';
44          }
45          // 点击Button控制Image的显示和消失
46          this.flag = !this.flag;
47        })
48      if (this.flag) {
49        Image($r('app.media.icon')).width(200).height(200)
50      }
51    }.height('100%').width('100%')
52  }
53}
54```
55**图2**  通过按钮的点击事件控制图片的显示和隐藏
56
57
58![ClickEventControl.gif](figures/ClickEventControl.gif)
59
60## 拖拽事件
61
62拖拽事件指手指/手写笔长按组件(>=500ms),并拖拽到接收区域释放的事件。
63
64拖拽事件的触发通过长按、拖动平移判定,手指平移的距离达到5vp即可触发拖拽事件。ArkUI支持应用内、跨应用的拖拽事件。
65
66拖拽事件触发流程:
67
68
69![zh-cn_image_0000001562820825](figures/zh-cn_image_0000001562820825.png)
70
71
72拖拽事件提供以下[接口](../reference/apis-arkui/arkui-ts/ts-universal-events-drag-drop.md):
73
74
75| 接口名称                                     | 描述                                       |
76| ---------------------------------------- | ---------------------------------------- |
77| onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilder \| DragItemInfo) | 拖拽启动接口。当前仅支持自定义pixelmap和自定义组件。           |
78| onDragEnter(event: (event?: DragEvent, extraParams?: string) => void) | 拖拽进入组件接口。DragEvent定义拖拽发生位置,extraParmas表示用户自定义信息 |
79| onDragLeave(event: (event?: DragEvent, extraParams?: string) => void) | 拖拽离开组件接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。 |
80| onDragMove(event: (event?: DragEvent, extraParams?: string) => void) | 拖拽移动接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。 |
81| onDrop(event: (event?: DragEvent, extraParams?: string) => void) | 拖拽释放组件接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。 |
82
83
84如下是跨窗口拖拽,拖出窗口示例:
85
86
87
88```ts
89import image from '@ohos.multimedia.image';
90
91@Entry
92@Component
93struct Index {
94  @State visible: Visibility = Visibility.Visible
95  private pixelMapReader:image.PixelMap|undefined = undefined
96
97  aboutToAppear() {
98    console.info('begin to create pixmap has info message: ')
99    this.createPixelMap()
100  }
101
102  createPixelMap() {
103    let color = new ArrayBuffer(4 * 96 * 96);
104    let buffer = new Uint8Array(color);
105    for (let i = 0; i < buffer.length; i++) {
106      buffer[i] = (i + 1) % 255;
107    }
108    class hw{
109      height:number = 96
110      width:number = 96
111    }
112    let hwo:hw = new hw()
113    let ops:image.InitializationOptions|void = {
114      'alphaType': 0,
115      'editable': true,
116      'pixelFormat': 4,
117      'scaleMode': 1,
118      'size': hwo
119    }
120    const promise: Promise<image.PixelMap> = image.createPixelMap(color, ops);
121    promise.then((data:image.PixelMap|undefined) => {
122      console.info('create pixmap has info message: ' + JSON.stringify(data))
123      if(data){
124        this.pixelMapReader = data;
125      }
126    })
127  }
128
129  @Builder pixelMapBuilder() {
130    Text('drag item')
131      .width('100%')
132      .height(100)
133      .fontSize(16)
134      .textAlign(TextAlign.Center)
135      .borderRadius(10)
136      .backgroundColor(0xFFFFFF)
137  }
138
139  build() {
140    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
141      Text('App1')
142        .width('40%')
143        .height(80)
144        .fontSize(20)
145        .margin(30)
146        .textAlign(TextAlign.Center)
147        .backgroundColor(Color.Pink)
148        .visibility(Visibility.Visible)
149
150      Text('Across Window Drag This')
151        .width('80%')
152        .height(80)
153        .fontSize(16)
154        .margin(30)
155        .textAlign(TextAlign.Center)
156        .backgroundColor(Color.Pink)
157        .visibility(this.visible)
158        .onDragStart((event: DragEvent|undefined, extraParams: string|undefined):CustomBuilder | DragItemInfo => {
159          console.info('Text onDrag start')
160          return { pixelMap: this.pixelMapReader, extraInfo: 'custom extra info.' }
161        })
162        .onDrop((event: DragEvent|undefined, extraParams: string|undefined) => {
163          console.info('Text onDragDrop,  ')
164          this.visible = Visibility.None                    //拖动结束后,使源不可见
165        })
166    }
167
168    .width('100%')
169    .height('100%')
170  }
171}
172```
173
174
175跨窗口拖拽,拖入示例:
176
177
178
179```ts
180
181@Entry
182@Component
183struct Index {
184  @State number: string[] = ['drag here']
185  @State text: string = ''
186  @State bool1: boolean = false
187  @State bool2: boolean = false
188  @State visible: Visibility = Visibility.Visible
189  @State visible2: Visibility = Visibility.None
190  scroller: Scroller = new Scroller()
191
192  build() {
193    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
194      Text('App2')
195        .width('40%')
196        .height(80)
197        .fontSize(20)
198        .margin(30)
199        .textAlign(TextAlign.Center)
200        .backgroundColor(Color.Pink)
201        .visibility(Visibility.Visible)
202
203      List({ space: 20, initialIndex: 0 }) {
204        ForEach(this.number, (item:string) => {
205          ListItem() {
206            Text('' + item)
207              .width('100%')
208              .height(80)
209              .fontSize(16)
210              .borderRadius(10)
211              .textAlign(TextAlign.Center)
212              .backgroundColor(0xFFFFFF)
213          }
214        }, (item:string):string => item)
215
216        ListItem() {
217          Text('Across Window Drag This')
218            .width('80%')
219            .height(80)
220            .fontSize(16)
221            .margin(30)
222            .textAlign(TextAlign.Center)
223            .backgroundColor(Color.Pink)
224            .visibility(this.visible2)
225        }
226      }
227      .height('50%')
228      .width('90%')
229      .border({ width: 1 })
230      .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })
231      .onDragEnter((event: DragEvent|undefined, extraParams: string|undefined) => {                         //拖拽进去组件
232        console.info('List onDragEnter, ' + extraParams)
233      })
234      .onDragMove((event: DragEvent|undefined, extraParams: string|undefined) => {                          //拖拽时移动
235        console.info('List onDragMove, ' + extraParams)
236      })
237      .onDragLeave((event: DragEvent|undefined, extraParams: string|undefined) => {                         //拖拽离开组件
238        console.info('List onDragLeave, ' + extraParams)
239      })
240      .onDrop((event: DragEvent|undefined, extraParams: string|undefined) => {                              //释放组件
241        console.info('List onDragDrop, ' + extraParams)
242        this.visible2 = Visibility.Visible                                              //拖拽完成使拖入目标可见
243      })
244    }
245    .width('100%')
246    .height('100%')
247  }
248}
249```
250![zh-cn_image_drag_drop](figures/zh-cn_image_drag_drop.gif)
251
252## 触摸事件
253
254当手指或手写笔在组件上触碰时,会触发不同动作所对应的事件响应,包括按下(Down)、滑动(Move)、抬起(Up)事件:
255
256
257```ts
258onTouch(event: (event?: TouchEvent) => void)
259```
260
261- event.typeTouchType.Down:表示手指按下。
262
263- event.typeTouchType.Up:表示手指抬起。
264
265- event.typeTouchType.Move:表示手指按住移动。
266
267触摸事件可以同时多指触发,通过event参数可获取触发的手指位置、手指唯一标志、当前发生变化的手指和输入的设备源等信息。
268
269
270```ts
271// xxx.ets
272@Entry
273@Component
274struct TouchExample {
275  @State text: string = '';
276  @State eventType: string = '';
277
278  build() {
279    Column() {
280      Button('Touch').height(40).width(100)
281        .onTouch((event?: TouchEvent) => {
282          if(event){
283            if (event.type === TouchType.Down) {
284              this.eventType = 'Down';
285            }
286            if (event.type === TouchType.Up) {
287              this.eventType = 'Up';
288            }
289            if (event.type === TouchType.Move) {
290              this.eventType = 'Move';
291            }
292            this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
293            + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
294            + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
295            + event.target.area.width + '\nheight:' + event.target.area.height
296          }
297        })
298      Button('Touch').height(50).width(200).margin(20)
299        .onTouch((event?: TouchEvent) => {
300          if(event){
301            if (event.type === TouchType.Down) {
302              this.eventType = 'Down';
303            }
304            if (event.type === TouchType.Up) {
305              this.eventType = 'Up';
306            }
307            if (event.type === TouchType.Move) {
308              this.eventType = 'Move';
309            }
310            this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
311            + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
312            + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
313            + event.target.area.width + '\nheight:' + event.target.area.height
314          }
315        })
316      Text(this.text)
317    }.width('100%').padding(30)
318  }
319}
320```
321
322
323![zh-cn_image_0000001511900468](figures/zh-cn_image_0000001511900468.gif)
324
325## 相关实例
326
327针对触屏事件开发,有以下相关实例可供参考:
328
329- [ArkTS组件集(ArkTS)(Full SDK)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/UI/ArkTsComponentCollection/ComponentCollection)