拖拽事件

2024-01-22 11:02 更新

拖拽事件指組件被長(zhǎng)按后拖拽時(shí)觸發(fā)的事件。

說(shuō)明

從API Version 8開(kāi)始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨(dú)標(biāo)記該內(nèi)容的起始版本。

事件

名稱

支持冒泡

功能描述

onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilder | DragItemInfo)

第一次拖拽此事件綁定的組件時(shí),觸發(fā)回調(diào)。

- event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。

- extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。

返回值:當(dāng)前跟手效果所拖拽的對(duì)象,用于顯示拖拽時(shí)的提示組件。

長(zhǎng)按150ms可觸發(fā)拖拽事件。優(yōu)先級(jí):長(zhǎng)按手勢(shì)配置時(shí)間小于等于150ms時(shí),長(zhǎng)按手勢(shì)優(yōu)先觸發(fā),否則拖拽事件優(yōu)先觸發(fā)。

onDragEnter(event: (event?: DragEvent, extraParams?: string) => void)

拖拽進(jìn)入組件范圍內(nèi)時(shí),觸發(fā)回調(diào)。

- event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。

- extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。

當(dāng)監(jiān)聽(tīng)了onDrop事件時(shí),此事件才有效。

onDragMove(event: (event?: DragEvent, extraParams?: string) => void)

拖拽在組件范圍內(nèi)移動(dòng)時(shí),觸發(fā)回調(diào)。

- event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。

- extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。

當(dāng)監(jiān)聽(tīng)了onDrop事件時(shí),此事件才有效。

onDragLeave(event: (event?: DragEvent, extraParams?: string) => void)

拖拽離開(kāi)組件范圍內(nèi)時(shí),觸發(fā)回調(diào)。

- event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。

- extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。

當(dāng)監(jiān)聽(tīng)了onDrop事件時(shí),此事件才有效。

onDrop(event: (event?: DragEvent, extraParams?: string) => void)

綁定此事件的組件可作為拖拽釋放目標(biāo),當(dāng)在本組件范圍內(nèi)停止拖拽行為時(shí),觸發(fā)回調(diào)。

- event:拖拽事件信息,包括拖拽點(diǎn)坐標(biāo)。

- extraParams:拖拽事件額外信息,詳見(jiàn)extraParams說(shuō)明。

DragItemInfo說(shuō)明

名稱

類型

必填

描述

pixelMap

PixelMap

設(shè)置拖拽過(guò)程中顯示的圖片。

builder

CustomBuilder

拖拽過(guò)程中顯示自定義組件,如果設(shè)置了pixelMap,則忽略此值。

extraInfo

string

拖拽項(xiàng)的描述。

extraParams說(shuō)明

用于返回組件在拖拽中需要用到的額外信息。

extraParams是Json對(duì)象轉(zhuǎn)換的string字符串,可以通過(guò)Json.parse轉(zhuǎn)換的Json對(duì)象獲取如下屬性。

名稱

類型

描述

selectedIndex

number

當(dāng)拖拽事件設(shè)在父容器的子元素時(shí),selectedIndex表示當(dāng)前被拖拽子元素是父容器第selectedIndex個(gè)子元素,selectedIndex從0開(kāi)始。

僅在ListItem組件的拖拽事件中生效。

insertIndex

number

當(dāng)前拖拽元素在List組件中放下時(shí),insertIndex表示被拖拽元素插入該組件的第insertIndex個(gè)位置,insertIndex從0開(kāi)始。

僅在List組件的拖拽事件中生效。

DragEvent說(shuō)明

名稱

類型

描述

getX()

number

當(dāng)前拖拽點(diǎn)相對(duì)于屏幕左上角的x軸坐標(biāo),單位為vp。

getY()

number

當(dāng)前拖拽點(diǎn)相對(duì)于屏幕左上角的y軸坐標(biāo),單位為vp。

示例

示例1

  1. @Observed
  2. class ClassA {
  3. public name: string
  4. public bol: boolean
  5. constructor(name: string, bol: boolean) {
  6. this.name = name
  7. this.bol = bol
  8. }
  9. }
  10. @Extend(Text) function textStyle() {
  11. .width('25%')
  12. .height(35)
  13. .fontSize(16)
  14. .textAlign(TextAlign.Center)
  15. .backgroundColor(0xAFEEEE)
  16. }
  17. @Entry
  18. @Component
  19. struct DragExample {
  20. @State arr: ClassA[] = [new ClassA('A', true), new ClassA('B', true), new ClassA('C', true)]
  21. @State dragIndex: number = 0
  22. changeIndex(index1: number, index2: number) { // 交換數(shù)組位置
  23. [this.arr[index1], this.arr[index2]] = [this.arr[index2], this.arr[index1]];
  24. }
  25. build() {
  26. Column() {
  27. Row({ space: 15 }) {
  28. List({ space: 20 }) {
  29. ForEach(this.arr, (item, index) => {
  30. ListItem() {
  31. Column() {
  32. Child({ a: this.arr[index] })
  33. }
  34. .onTouch((event: TouchEvent) => {
  35. if (event.type === TouchType.Down) {
  36. this.dragIndex = index // 獲取當(dāng)前拖拽子組件的索引
  37. console.info('onTouch' + this.dragIndex)
  38. }
  39. })
  40. }
  41. })
  42. }
  43. .listDirection(Axis.Horizontal)
  44. .onDrop((event: DragEvent, extraParams: string) => { // 綁定此事件的組件可作為拖拽釋放目標(biāo),當(dāng)在本組件范圍內(nèi)停止拖拽行為時(shí),觸發(fā)回調(diào)。
  45. let jsonString = JSON.parse(extraParams);
  46. this.changeIndex(this.dragIndex, jsonString.insertIndex)
  47. })
  48. }.padding({ top: 10, bottom: 10 }).margin(10)
  49. }.width('100%').height('100%').padding({ top: 20 }).margin({ top: 20 })
  50. }
  51. }
  52. @Component
  53. struct Child {
  54. @ObjectLink a: ClassA
  55. @Builder pixelMapBuilder() {
  56. Column() {
  57. Text(this.a.name)
  58. .width('50%')
  59. .height(60)
  60. .fontSize(16)
  61. .borderRadius(10)
  62. .textAlign(TextAlign.Center)
  63. .backgroundColor(Color.Yellow)
  64. }
  65. }
  66. build() {
  67. Column() {
  68. Text(this.a.name)
  69. .textStyle()
  70. .visibility(this.a.bol ? Visibility.Visible : Visibility.None)
  71. .onDragStart(() => { // 第一次拖拽此事件綁定的組件時(shí),觸發(fā)回調(diào)。
  72. this.a.bol = false // 控制顯隱
  73. return this.pixelMapBuilder() // 設(shè)置拖拽過(guò)程中顯示的圖片。
  74. })
  75. .onTouch((event: TouchEvent) => {
  76. if (event.type === TouchType.Up) {
  77. this.a.bol = true
  78. }
  79. })
  80. Text('')
  81. .width('25%')
  82. .height(35)
  83. .fontSize(16)
  84. .textAlign(TextAlign.Center)
  85. .border({ width: 5, color: 'red' })
  86. .visibility(!this.a.bol ? Visibility.Visible : Visibility.None)
  87. }
  88. }
  89. }

示例2

  1. // xxx.ets
  2. @Extend(Text) function textStyle () {
  3. .width('25%')
  4. .height(35)
  5. .fontSize(16)
  6. .textAlign(TextAlign.Center)
  7. .backgroundColor(0xAFEEEE)
  8. }
  9. @Entry
  10. @Component
  11. struct DragExample {
  12. @State numbers: string[] = ['one', 'two', 'three', 'four', 'five', 'six']
  13. @State text: string = ''
  14. @State bool: boolean = true
  15. @State eventType: string = ''
  16. @State appleVisible: Visibility = Visibility.Visible
  17. @State orangeVisible: Visibility = Visibility.Visible
  18. @State bananaVisible: Visibility = Visibility.Visible
  19. private dragList: string[] = ['apple', 'orange', 'banana']
  20. @State fruitVisible: Visibility[] = [Visibility.Visible, Visibility.Visible, Visibility.Visible]
  21. @State idx: number = 0
  22. // 自定義拖拽過(guò)程中顯示的內(nèi)容
  23. @Builder pixelMapBuilder() {
  24. Column() {
  25. Text(this.text)
  26. .width('50%')
  27. .height(60)
  28. .fontSize(16)
  29. .borderRadius(10)
  30. .textAlign(TextAlign.Center)
  31. .backgroundColor(Color.Yellow)
  32. }
  33. }
  34. build() {
  35. Column() {
  36. Text('There are three Text elements here')
  37. .fontSize(12)
  38. .fontColor(0xCCCCCC)
  39. .width('90%')
  40. .textAlign(TextAlign.Start)
  41. .margin(5)
  42. Row({ space: 15 }) {
  43. ForEach(this.dragList, (item, index) => {
  44. Text(item)
  45. .textStyle()
  46. .visibility(this.fruitVisible[index])
  47. .onDragStart(() => {
  48. this.bool = true
  49. this.text = item
  50. this.fruitVisible[index] = Visibility.None
  51. return this.pixelMapBuilder
  52. })
  53. .onTouch((event: TouchEvent) => {
  54. if (event.type === TouchType.Down) {
  55. this.eventType = 'Down'
  56. this.idx = index
  57. }
  58. if (event.type === TouchType.Up) {
  59. this.eventType = 'Up'
  60. if (this.bool) {
  61. this.fruitVisible[index] = Visibility.Visible
  62. }
  63. }
  64. })
  65. })
  66. }.padding({ top: 10, bottom: 10 }).margin(10)
  67. Text('This is a List element')
  68. .fontSize(12)
  69. .fontColor(0xCCCCCC)
  70. .width('90%')
  71. .textAlign(TextAlign.Start)
  72. .margin(15)
  73. List({ space: 20 }) {
  74. ForEach(this.numbers, (item) => {
  75. ListItem() {
  76. Text(item)
  77. .width('100%')
  78. .height(80)
  79. .fontSize(16)
  80. .borderRadius(10)
  81. .textAlign(TextAlign.Center)
  82. .backgroundColor(0xAFEEEE)
  83. }
  84. }, item => item)
  85. }
  86. .editMode(true)
  87. .height('50%')
  88. .width('90%')
  89. .border({ width: 1 })
  90. .padding(15)
  91. .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 })
  92. .onDragEnter((event: DragEvent, extraParams: string) => {
  93. console.log('List onDragEnter, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
  94. })
  95. .onDragMove((event: DragEvent, extraParams: string) => {
  96. console.log('List onDragMove, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
  97. })
  98. .onDragLeave((event: DragEvent, extraParams: string) => {
  99. console.log('List onDragLeave, ' + extraParams + 'X:' + event.getX() + 'Y:' + event.getY())
  100. })
  101. .onDrop((event: DragEvent, extraParams: string) => {
  102. let jsonString = JSON.parse(extraParams);
  103. if (this.bool) {
  104. // 通過(guò)splice方法插入元素
  105. this.numbers.splice(jsonString.insertIndex, 0, this.text)
  106. this.bool = false
  107. }
  108. this.fruitVisible[this.idx] = Visibility.None
  109. })
  110. }.width('100%').height('100%').padding({ top: 20 }).margin({ top: 20 })
  111. }
  112. }

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)