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