ts-universal-events-drag-drop.md 8.2 KB
Newer Older
Z
zengyawen 已提交
1 2
# 拖拽事件

3
拖拽事件指组件被长按后拖拽时触发的事件。
T
explain  
tianyu 已提交
4

H
geshi  
HelloCrease 已提交
5
>  **说明:**
H
HelloCrease 已提交
6
>
H
HelloCrease 已提交
7
>  从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
8

9
## 事件
Z
zengyawen 已提交
10

Y
yamila 已提交
11 12 13 14 15 16 17
| 名称                                                         | 支持冒泡 | 功能描述                                                     |
| ------------------------------------------------------------ | -------- | ------------------------------------------------------------ |
| onDragStart(event:&nbsp;(event?:&nbsp;[DragEvent](#dragevent说明),&nbsp;extraParams?:&nbsp;string)&nbsp;=&gt;&nbsp;&nbsp;[CustomBuilder](ts-types.md#custombuilder8) \| [DragItemInfo](#dragiteminfo说明)) | 否       | 第一次拖拽此事件绑定的组件时,触发回调。<br/>- event:拖拽事件信息,包括拖拽点坐标。<br/>- extraParams:拖拽事件额外信息,详见[extraParams](#extraparams说明)说明。<br/>返回值:当前跟手效果所拖拽的对象,用于显示拖拽时的提示组件。<br/>长按150ms可触发拖拽事件。优先级:长按手势配置时间小于等于150ms时,长按手势优先触发,否则拖拽事件优先触发。 |
| onDragEnter(event:&nbsp;(event?:&nbsp;[DragEvent](#dragevent说明),&nbsp;extraParams?:&nbsp;string)&nbsp;=&gt;&nbsp;void) | 否       | 拖拽进入组件范围内时,触发回调。<br/>- event:拖拽事件信息,包括拖拽点坐标。<br/>- extraParams:拖拽事件额外信息,详见[extraParams](#extraparams说明)说明。<br/>当监听了onDrop事件时,此事件才有效。 |
| onDragMove(event:&nbsp;(event?:&nbsp;[DragEvent](#dragevent说明),&nbsp;extraParams?:&nbsp;string)&nbsp;=&gt;&nbsp;void) | 否       | 拖拽在组件范围内移动时,触发回调。<br/>- event:拖拽事件信息,包括拖拽点坐标。<br/>- extraParams:拖拽事件额外信息,详见[extraParams](#extraparams说明)说明。<br/>当监听了onDrop事件时,此事件才有效。 |
| onDragLeave(event:&nbsp;(event?:&nbsp;[DragEvent](#dragevent说明),&nbsp;extraParams?:&nbsp;string)&nbsp;=&gt;&nbsp;void) | 否       | 拖拽离开组件范围内时,触发回调。<br/>- event:拖拽事件信息,包括拖拽点坐标。<br/>- extraParams:拖拽事件额外信息,详见[extraParams](#extraparams说明)说明。<br/>当监听了onDrop事件时,此事件才有效。 |
| onDrop(event:&nbsp;(event?:&nbsp;[DragEvent](#dragevent说明),&nbsp;extraParams?:&nbsp;string)&nbsp;=&gt;&nbsp;void) | 否       | 绑定此事件的组件可作为拖拽释放目标,当在本组件范围内停止拖拽行为时,触发回调。<br/>- event:拖拽事件信息,包括拖拽点坐标。<br/>- extraParams:拖拽事件额外信息,详见[extraParams](#extraparams说明)说明。 |
Z
zengyawen 已提交
18

K
kangchongtao 已提交
19
## DragItemInfo说明
H
HelloCrease 已提交
20

21
| 名称      | 类型                                     | 必填   | 描述                                |
H
HelloCrease 已提交
22 23
| --------- | ---------------------------------------- | ---- | --------------------------------- |
| pixelMap  | [PixelMap](../apis/js-apis-image.md#pixelmap7) | 否    | 设置拖拽过程中显示的图片。                     |
24
| builder   | [CustomBuilder](ts-types.md#custombuilder8) | 否    | 拖拽过程中显示自定义组件,如果设置了pixelMap,则忽略此值。 |
H
HelloCrease 已提交
25
| extraInfo | string                                   | 否    | 拖拽项的描述。                           |
K
kangchongtao 已提交
26 27


28
## extraParams说明
H
HelloCrease 已提交
29

Z
zengyawen 已提交
30
  用于返回组件在拖拽中需要用到的额外信息。
H
HelloCrease 已提交
31

32
  extraParams是Json对象转换的string字符串,可以通过Json.parse转换的Json对象获取如下属性。
Z
zengyawen 已提交
33

34
| 名称          | 类型   | 描述                                       |
H
HelloCrease 已提交
35
| ------------- | ------ | ---------------------------------------- |
36
| selectedIndex | number | 当拖拽事件设在父容器的子元素时,selectedIndex表示当前被拖拽子元素是父容器第selectedIndex个子元素,selectedIndex从0开始。<br/>仅在ListItem组件的拖拽事件中生效。 |
H
HelloCrease 已提交
37 38
| insertIndex   | number | 当前拖拽元素在List组件中放下时,insertIndex表示被拖拽元素插入该组件的第insertIndex个位置,insertIndex从0开始。<br/>仅在List组件的拖拽事件中生效。 |

39
## DragEvent说明
H
HelloCrease 已提交
40

41
| 名称     | 类型  | 描述             |
H
HelloCrease 已提交
42
| ------ | ------ | ---------------- |
43 44
| getX() | number | 当前拖拽点相对于屏幕左上角的x轴坐标,单位为vp。 |
| getY() | number | 当前拖拽点相对于屏幕左上角的y轴坐标,单位为vp。 |
Z
zengyawen 已提交
45 46 47

## 示例

H
geshi  
HelloCrease 已提交
48 49
```ts
// xxx.ets
W
wangshuainan 已提交
50 51 52 53 54 55 56 57
@Extend(Text) function textStyle () {
  .width('25%')
  .height(35)
  .fontSize(16)
  .textAlign(TextAlign.Center)
  .backgroundColor(0xAFEEEE)
}

Z
zengyawen 已提交
58 59 60
@Entry
@Component
struct DragExample {
Y
yamila 已提交
61 62
  @State numbers: string[] = ['one', 'two', 'three', 'four', 'five', 'six']
  @State text: string = ''
W
wangshuainan 已提交
63 64
  @State bool: boolean = true
  @State eventType: string = ''
Y
yamila 已提交
65 66 67
  @State appleVisible: Visibility = Visibility.Visible
  @State orangeVisible: Visibility = Visibility.Visible
  @State bananaVisible: Visibility = Visibility.Visible
W
wangshuainan 已提交
68 69 70
  private dragList: string[] = ['apple', 'orange', 'banana']
  @State fruitVisible: Visibility[] = [Visibility.Visible, Visibility.Visible, Visibility.Visible]
  @State index: number = 0
71 72

  // 自定义拖拽过程中显示的内容
Z
zengyawen 已提交
73 74 75
  @Builder pixelMapBuilder() {
    Column() {
      Text(this.text)
76 77 78 79 80 81
        .width('50%')
        .height(60)
        .fontSize(16)
        .borderRadius(10)
        .textAlign(TextAlign.Center)
        .backgroundColor(Color.Yellow)
Z
zengyawen 已提交
82 83 84 85 86 87
    }
  }

  build() {
    Column() {
      Text('There are three Text elements here')
88 89 90 91 92 93
        .fontSize(12)
        .fontColor(0xCCCCCC)
        .width('90%')
        .textAlign(TextAlign.Start)
        .margin(5)
      Row({ space: 15 }) {
W
wangshuainan 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
        ForEach(this.dragList, (item, index) => {
          Text(item)
            .textStyle()
            .visibility(this.fruitVisible[index])
            .onDragStart(() => {
              this.bool = true
              this.text = item
              this.fruitVisible[index] = Visibility.None
              return this.pixelMapBuilder
            })
            .onTouch((event: TouchEvent) => {
              if (event.type === TouchType.Down) {
                this.eventType = 'Down'
                this.index = index
              }
              if (event.type === TouchType.Up) {
                this.eventType = 'Up'
                if (this.bool) {
                  this.fruitVisible[index] = Visibility.Visible
                }
              }
            })
        })
117 118 119 120 121 122 123 124 125
      }.padding({ top: 10, bottom: 10 }).margin(10)

      Text('This is a List element')
        .fontSize(12)
        .fontColor(0xCCCCCC)
        .width('90%')
        .textAlign(TextAlign.Start)
        .margin(15)
      List({ space: 20 }) {
Z
zengyawen 已提交
126 127
        ForEach(this.numbers, (item) => {
          ListItem() {
128 129 130 131 132 133 134
            Text(item)
              .width('100%')
              .height(80)
              .fontSize(16)
              .borderRadius(10)
              .textAlign(TextAlign.Center)
              .backgroundColor(0xAFEEEE)
Z
zengyawen 已提交
135 136 137 138
          }
        }, item => item)
      }
      .editMode(true)
139 140 141 142
      .height('50%')
      .width('90%')
      .border({ width: 1 })
      .padding(15)
Z
zengyawen 已提交
143 144
      .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })
      .onDragEnter((event: DragEvent, extraParams: string) => {
Y
yamila 已提交
145
        console.log('List onDragEnter, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
Z
zengyawen 已提交
146 147
      })
      .onDragMove((event: DragEvent, extraParams: string) => {
Y
yamila 已提交
148
        console.log('List onDragMove, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
Z
zengyawen 已提交
149 150
      })
      .onDragLeave((event: DragEvent, extraParams: string) => {
Y
yamila 已提交
151
        console.log('List onDragLeave, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
Z
zengyawen 已提交
152 153
      })
      .onDrop((event: DragEvent, extraParams: string) => {
W
wangshuainan 已提交
154
        let jsonString = JSON.parse(extraParams);
Z
zengyawen 已提交
155
        if (this.bool) {
156
          // 通过splice方法插入元素
Y
yamila 已提交
157 158
          this.numbers.splice(jsonString.insertIndex, 0, this.text)
          this.bool = false
Z
zengyawen 已提交
159
        }
W
wangshuainan 已提交
160
        this.fruitVisible[this.index] = Visibility.None
Z
zengyawen 已提交
161 162 163 164 165 166 167
      })
    }.width('100%').height('100%').padding({ top: 20 }).margin({ top: 20 })
  }
}
```

![zh-cn_image_0000001252667389](figures/zh-cn_image_0000001252667389.gif)