1# 触屏事件 2 3 4触屏事件指当手指/手写笔在组件上按下、滑动、抬起时触发的回调事件。包括[点击事件](#点击事件)、[拖拽事件](#拖拽事件)和[触摸事件](#触摸事件)。 5 6 7**图1** 触摸事件原理 8 9 10 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 59 60## 拖拽事件 61 62拖拽事件指手指/手写笔长按组件(>=500ms),并拖拽到接收区域释放的事件。 63 64拖拽事件的触发通过长按、拖动平移判定,手指平移的距离达到5vp即可触发拖拽事件。ArkUI支持应用内、跨应用的拖拽事件。 65 66拖拽事件触发流程: 67 68 69 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 251 252## 触摸事件 253 254当手指或手写笔在组件上触碰时,会触发不同动作所对应的事件响应,包括按下(Down)、滑动(Move)、抬起(Up)事件: 255 256 257```ts 258onTouch(event: (event?: TouchEvent) => void) 259``` 260 261- event.type为TouchType.Down:表示手指按下。 262 263- event.type为TouchType.Up:表示手指抬起。 264 265- event.type为TouchType.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 324 325## 相关实例 326 327针对触屏事件开发,有以下相关实例可供参考: 328 329- [ArkTS组件集(ArkTS)(Full SDK)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/UI/ArkTsComponentCollection/ComponentCollection)