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.type为TouchType.Down:表示手指按下。 247 248- event.type为TouchType.Up:表示手指抬起。 249 250- event.type为TouchType.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