arkts-common-events-touch-screen-event.md 10.5 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6
# 触屏事件


触屏事件指当手指/手写笔在组件上按下、滑动、抬起时触发的回调事件。包括[点击事件](#点击事件)[拖拽事件](#拖拽事件)[触摸事件](#触摸事件)


H
HelloCrease 已提交
7
**图1**  触摸事件原理
Z
zengyawen 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90


![zh-cn_image_0000001562700461](figures/zh-cn_image_0000001562700461.png)


## 点击事件

点击事件是指通过手指或手写笔做出一次完整的按下和抬起动作。当发生点击事件时,会触发以下回调函数:



```ts
onClick(event: (event?: ClickEvent) => void)
```


event参数提供点击事件相对于窗口或组件的坐标位置,以及发生点击的事件源。


  例如通过按钮的点击事件控制图片的显示和隐藏。

```ts
@Entry
@Component
struct IfElseTransition {
  @State flag: boolean = true;
  @State btnMsg: string = 'show';

  build() {
    Column() {
      Button(this.btnMsg).width(80).height(30).margin(30)
        .onClick(() => {
          if (this.flag) {
            this.btnMsg = 'hide';
          } else {
            this.btnMsg = 'show';
          }
          // 点击Button控制Image的显示和消失
          this.flag = !this.flag;
        })
      if (this.flag) {
        Image($r('app.media.icon')).width(200).height(200)
      }
    }.height('100%').width('100%')
  }
}
```


## 拖拽事件

拖拽事件指手指/手写笔长按组件(>=500ms),并拖拽到接收区域释放的事件。拖拽事件触发流程:


![zh-cn_image_0000001562820825](figures/zh-cn_image_0000001562820825.png)


拖拽事件的触发通过长按、拖动平移判定,手指平移的距离达到5vp即可触发拖拽事件。ArkUI支持应用内、跨应用的拖拽事件。


拖拽事件提供以下[接口](../reference/arkui-ts/ts-universal-events-drag-drop.md)


| 接口名称                                     | 描述                                       |
| ---------------------------------------- | ---------------------------------------- |
| onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilder \| DragItemInfo) | 拖拽启动接口。当前仅支持自定义pixelmap和自定义组件。           |
| onDragEnter(event: (event?: DragEvent, extraParams?: string) => void) | 拖拽进入组件接口。DragEvent定义拖拽发生位置,extraParmas表示用户自定义信息 |
| onDragLeave(event: (event?: DragEvent, extraParams?: string) => void) | 拖拽离开组件接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。 |
| onDragMove(event: (event?: DragEvent, extraParams?: string) => void) | 拖拽移动接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。 |
| onDrop(event: (event?: DragEvent, extraParams?: string) => void) | 拖拽释放组件接口。DragEvent定义拖拽发生位置,extraParmas表示拖拽事件额外信息。 |


如下是跨窗口拖拽,拖出窗口示例:



```ts
import image from '@ohos.multimedia.image';

@Entry
@Component
struct Index {
  @State visible: Visibility = Visibility.Visible
L
lixinnan 已提交
91
  private pixelMapReader:object|undefined = undefined
Z
zengyawen 已提交
92 93 94 95 96 97 98 99

  aboutToAppear() {
    console.info('begin to create pixmap has info message: ')
    this.createPixelMap()
  }

  createPixelMap() {
    let color = new ArrayBuffer(4 * 96 * 96);
L
lixinnan 已提交
100 101
    let buffer = new Uint8Array(color);
    for (let i = 0; i < buffer.length; i++) {
Z
zengyawen 已提交
102 103
      buffer[i] = (i + 1) % 255;
    }
L
lixinnan 已提交
104 105 106
    class hw{
      height:number = 96
      width:number = 96
Z
zengyawen 已提交
107
    }
L
lixinnan 已提交
108 109 110 111 112 113 114 115 116 117
    let hwo:hw = new hw()
    let opts:Record<string,number|boolean|hw> = {
      'alphaType': 0,
      'editable': true,
      'pixelFormat': 4,
      'scaleMode': 1,
      'size': hwo
    }
    const promise:image = image.createPixelMap(color, opts);
    promise.then((data:object|undefined) => {
Z
zengyawen 已提交
118
      console.info('create pixmap has info message: ' + JSON.stringify(data))
L
lixinnan 已提交
119 120 121
      if(data){
        this.pixelMapReader = data;
      }
Z
zengyawen 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
    })
  }

  @Builder pixelMapBuilder() {
    Text('drag item')
      .width('100%')
      .height(100)
      .fontSize(16)
      .textAlign(TextAlign.Center)
      .borderRadius(10)
      .backgroundColor(0xFFFFFF)
  }

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Text('App1')
        .width('40%')
        .height(80)
        .fontSize(20)
        .margin(30)
        .textAlign(TextAlign.Center)
        .backgroundColor(Color.Pink)
        .visibility(Visibility.Visible)

      Text('Across Window Drag This')
        .width('80%')
        .height(80)
        .fontSize(16)
        .margin(30)
        .textAlign(TextAlign.Center)
        .backgroundColor(Color.Pink)
        .visibility(this.visible)
        .onDragStart(() => {                    //启动跨窗口拖拽
          console.info('Text onDrag start')
          return { pixelMap: this.pixelMapReader, extraInfo: 'custom extra info.' }
        })
L
lixinnan 已提交
158
        .onDrop((event: DragEvent|undefined, extraParams: string|undefined) => {
Z
zengyawen 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
          console.info('Text onDragDrop,  ')
          this.visible = Visibility.None                    //拖动结束后,使源不可见
        })
    }

    .width('100%')
    .height('100%')
  }
}
```


跨窗口拖拽,拖入示例:



```ts

@Entry
@Component
struct Index {
  @State number: string[] = ['drag here']
  @State text: string = ''
  @State bool1: boolean = false
  @State bool2: boolean = false
  @State visible: Visibility = Visibility.Visible
  @State visible2: Visibility = Visibility.None
  scroller: Scroller = new Scroller()

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Text('App2')
        .width('40%')
        .height(80)
        .fontSize(20)
        .margin(30)
        .textAlign(TextAlign.Center)
        .backgroundColor(Color.Pink)
        .visibility(Visibility.Visible)

      List({ space: 20, initialIndex: 0 }) {
L
lixinnan 已提交
200
        ForEach(this.number, (item:string) => {
Z
zengyawen 已提交
201 202 203 204 205 206 207 208 209
          ListItem() {
            Text('' + item)
              .width('100%')
              .height(80)
              .fontSize(16)
              .borderRadius(10)
              .textAlign(TextAlign.Center)
              .backgroundColor(0xFFFFFF)
          }
L
lixinnan 已提交
210
        }, ((item:string):string => item))
Z
zengyawen 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226

        ListItem() {
          Text('Across Window Drag This')
            .width('80%')
            .height(80)
            .fontSize(16)
            .margin(30)
            .textAlign(TextAlign.Center)
            .backgroundColor(Color.Pink)
            .visibility(this.visible2)
        }
      }
      .height('50%')
      .width('90%')
      .border({ width: 1 })
      .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })
L
lixinnan 已提交
227
      .onDragEnter((event: DragEvent|undefined, extraParams: string|undefined) => {                         //拖拽进去组件
Z
zengyawen 已提交
228 229
        console.info('List onDragEnter, ' + extraParams)
      })
L
lixinnan 已提交
230
      .onDragMove((event: DragEvent|undefined, extraParams: string|undefined) => {                          //拖拽时移动
Z
zengyawen 已提交
231 232
        console.info('List onDragMove, ' + extraParams)
      })
L
lixinnan 已提交
233
      .onDragLeave((event: DragEvent|undefined, extraParams: string|undefined) => {                         //拖拽离开组件
Z
zengyawen 已提交
234 235
        console.info('List onDragLeave, ' + extraParams)
      })
L
lixinnan 已提交
236
      .onDrop((event: DragEvent|undefined, extraParams: string|undefined) => {                              //释放组件
Z
zengyawen 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
        console.info('List onDragDrop, ' + extraParams)
        this.visible2 = Visibility.Visible                                              //拖拽完成使拖入目标可见
      })
    }
    .width('100%')
    .height('100%')
  }
}
```


## 触摸事件

当手指或手写笔在组件上触碰时,会触发不同动作所对应的事件响应,包括按下(Down)、滑动(Move)、抬起(Up)事件:


```ts
onTouch(event: (event?: TouchEvent) => void)
```

- event.type为TouchType.Down:表示手指按下。

- event.type为TouchType.Up:表示手指抬起。

- event.type为TouchType.Move:表示手指按住移动。

触摸事件可以同时多指触发,通过event参数可获取触发的手指位置、手指唯一标志、当前发生变化的手指和输入的设备源等信息。


```ts
// xxx.ets
@Entry
@Component
struct TouchExample {
  @State text: string = '';
  @State eventType: string = '';

  build() {
    Column() {
      Button('Touch').height(40).width(100)
L
lixinnan 已提交
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
        .onTouch((event?: TouchEvent) => {
          if(event){
            if (event.type === TouchType.Down) {
              this.eventType = 'Down';
            }
            if (event.type === TouchType.Up) {
              this.eventType = 'Up';
            }
            if (event.type === TouchType.Move) {
              this.eventType = 'Move';
            }
            this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
            + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
            + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
            + event.target.area.width + '\nheight:' + event.target.area.height
Z
zengyawen 已提交
292 293 294
          }
        })
      Button('Touch').height(50).width(200).margin(20)
L
lixinnan 已提交
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
        .onTouch((event?: TouchEvent) => {
          if(event){
            if (event.type === TouchType.Down) {
              this.eventType = 'Down';
            }
            if (event.type === TouchType.Up) {
              this.eventType = 'Up';
            }
            if (event.type === TouchType.Move) {
              this.eventType = 'Move';
            }
            this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
            + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
            + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
            + event.target.area.width + '\nheight:' + event.target.area.height
Z
zengyawen 已提交
310 311 312 313 314 315 316 317 318 319
          }
        })
      Text(this.text)
    }.width('100%').padding(30)
  }
}
```


![zh-cn_image_0000001511900468](figures/zh-cn_image_0000001511900468.gif)
320 321 322 323 324

## 相关实例

针对触屏事件开发,有以下相关实例可供参考:

Z
zwx1094577 已提交
325
- [ArkTS组件集(ArkTS)(Full SDK)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/UI/ArkTsComponentCollection/ComponentCollection)