1# 拖拽事件
2
3拖拽事件指组件被长按后拖拽时触发的事件。
4
5>  **说明:**
6>
7>  从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8>
9> 应用本身预置的资源文件(即应用在安装前的HAP包中已经存在的资源文件)仅支持本地应用内拖拽。
10
11ArkUI框架对以下组件实现了默认的拖拽能力,支持对数据的拖出或拖入响应。开发者也可以通过实现通用拖拽事件来自定义拖拽响应。
12
13- 默认支持拖出能力的组件(可从组件上拖出数据):[Search](ts-basic-components-search.md)、[TextInput](ts-basic-components-textinput.md)、[TextArea](ts-basic-components-textarea.md)、[RichEditor](ts-basic-components-richeditor.md)、[Text](ts-basic-components-text.md)、[Image](ts-basic-components-image.md)、<!--Del-->[FormComponent](ts-basic-components-formcomponent-sys.md)、<!--DelEnd-->[Hyperlink](ts-container-hyperlink.md),开发者可通过设置这些组件的[draggable](ts-universal-attributes-drag-drop.md#draggable)属性来控制对默认拖拽能力的使用。
14
15- 默认支持拖入能力的组件(目标组件可响应拖入数据):[Search](ts-basic-components-search.md)、[TextInput](ts-basic-components-textinput.md)、[TextArea](ts-basic-components-textarea.md)、[RichEditor](ts-basic-components-richeditor.md),开发者可通过设置这些组件的[allowDrop](ts-universal-attributes-drag-drop.md#allowdrop)属性为null来禁用对默认拖入能力的支持。
16
17<!--RP1--><!--RP1End-->其他组件需要开发者将draggable属性设置为true,并在onDragStart等接口中实现数据传输相关内容,才能正确处理拖拽。
18
19> **说明:**
20>
21> Text组件需配合[copyOption](ts-basic-components-text.md#copyoption9)一起使用,设置copyOptions为CopyOptions.InApp或者CopyOptions.LocalDevice22
23## onDragStart
24
25onDragStart(event: (event: DragEvent, extraParams?: string) => CustomBuilder | DragItemInfo)
26
27第一次拖拽此事件绑定的组件时,长按时间 >= 500ms,然后手指移动距离 >= 10vp,触发回调。
28
29针对默认支持拖出能力的组件,如果开发者设置了onDragStart,优先执行开发者的onDragStart,并根据执行情况决定是否使用系统默认的拖出能力,具体为:
30- 如果开发者返回了自定义背板图,则不再使用系统默认的拖拽背板图;
31- 如果开发者设置了拖拽数据,则不再使用系统默认填充的拖拽数据。
32
33文本类组件[Text](ts-basic-components-text.md)、[Search](ts-basic-components-search.md)、[TextInput](ts-basic-components-textinput.md)、[TextArea](ts-basic-components-textarea.md)、[RichEditor](ts-basic-components-richeditor.md)对选中的文本内容进行拖拽时,不支持背板图的自定义。当onDragStart与菜单预览一起使用或使用了默认支持拖出能力的组件时,预览及菜单项上的自定义内容不支持拖拽。
34
35**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
36
37**事件优先级:** 长按触发时间 < 500ms,长按事件优先拖拽事件响应,长按触发时间 >= 500ms,拖拽事件优先长按事件响应。
38
39**系统能力:** SystemCapability.ArkUI.ArkUI.Full
40
41**参数:**
42
43| 参数名      | 类型                            | 必填 | 说明               |
44| ----------- | ------------------------------- | ---- | ------------------ |
45| event    | (event: [DragEvent](#dragevent), extraParams?: string) => [CustomBuilder](ts-types.md#custombuilder8) &nbsp;\|&nbsp; [DragItemInfo](#dragiteminfo说明)  | 是   | 回调函数。<br/> **说明:**<br/> event为拖拽事件信息。<br/> extraParams为拖拽事件额外信息。需要解析为Json格式,参考[extraParams](#extraparams说明)说明。|
46
47**返回值:**
48
49| 类型                                                         | 说明                     |
50| ------------------------------------------------------------ | ------------------------ |
51| [CustomBuilder](ts-types.md#custombuilder8)&nbsp;\|&nbsp;[DragItemInfo](#dragiteminfo说明) | 拽过程中显示的组件信息。<br/>**说明:** 不支持全局builder。 |
52
53## onDragEnter
54
55onDragEnter(event: (event: DragEvent, extraParams?: string) => void)
56
57拖拽进入组件范围内时,触发回调,当监听了[onDrop](#ondrop)事件时,此事件才有效。
58
59**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
60
61**系统能力:** SystemCapability.ArkUI.ArkUI.Full
62
63**参数:**
64
65| 参数名      | 类型                            | 必填 | 说明                           |
66| ----------- | ------------------------------- | ---- | ------------------------------ |
67| event    | (event: [DragEvent](#dragevent), extraParams?: string) => void   | 是   | 回调函数。<br/>**说明:**<br/> event为拖拽事件信息,包括拖拽点坐标。<br/> extraParams为拖拽事件额外信息,需要解析为Json格式,参考[extraParams](#extraparams说明)说明。|
68
69## onDragMove
70
71onDragMove(event: (event: DragEvent, extraParams?: string) => void)
72
73拖拽在组件范围内移动时,触发回调,当监听了[onDrop](#ondrop)事件时,此事件才有效。
74
75**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
76
77**系统能力:** SystemCapability.ArkUI.ArkUI.Full
78
79**参数:**
80
81| 参数名      | 类型                            | 必填 | 说明                           |
82| ----------- | ------------------------------- | ---- | ------------------------------ |
83| event    | (event: [DragEvent](#dragevent), extraParams?: string) => void   | 是   | 回调函数。<br/>**说明:**<br/> event为拖拽事件信息,包括拖拽点坐标。<br/> extraParams为拖拽事件额外信息,需要解析为Json格式,参考[extraParams](#extraparams说明)说明。|
84
85## onDragLeave
86
87onDragLeave(event: (event: DragEvent, extraParams?: string) => void)
88
89拖拽离开组件范围内时,触发回调,当监听了[onDrop](#ondrop)事件时,此事件才有效。
90
91**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
92
93**系统能力:** SystemCapability.ArkUI.ArkUI.Full
94
95**参数:**
96
97| 参数名      | 类型                            | 必填 | 说明                           |
98| ----------- | ------------------------------- | ---- | ------------------------------ |
99| event    | (event: [DragEvent](#dragevent), extraParams?: string) => void   | 是   | 回调函数。<br/>**说明:**<br/> event为拖拽事件信息,包括拖拽点坐标。<br/> extraParams为拖拽事件额外信息,需要解析为Json格式,参考[extraParams](#extraparams说明)说明。|
100
101## onDrop
102
103onDrop(event: (event: DragEvent, extraParams?: string) => void)
104
105绑定此事件的组件可作为拖拽释放目标,当在本组件范围内停止拖拽行为时,触发回调。如果开发者没有在onDrop中主动调用event.setResult()设置拖拽接收的结果,若拖拽组件为系统支持默认拖入的组件,以系统实际处理数据结果为准,其它组件则系统按照数据接收成功处理。
106
107**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
108
109**系统能力:** SystemCapability.ArkUI.ArkUI.Full
110
111**参数:**
112
113| 参数名      | 类型                            | 必填 | 说明                           |
114| ----------- | ------------------------------- | ---- | ------------------------------ |
115| event    | (event: [DragEvent](#dragevent), extraParams?: string) => void   | 是   | 回调函数。<br/>**说明:**<br/> event为拖拽事件信息,包括拖拽点坐标。<br/> extraParams为拖拽事件额外信息,需要解析为Json格式,参考[extraParams](#extraparams说明)说明。|
116
117## onDragEnd
118
119onDragEnd(event: (event: DragEvent, extraParams?: string) => void)
120
121绑定此事件的组件触发的拖拽结束后,触发回调。
122
123**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
124
125**系统能力:** SystemCapability.ArkUI.ArkUI.Full
126
127**参数:**
128
129| 参数名      | 类型                            | 必填 | 说明                           |
130| ----------- | ------------------------------- | ---- | ------------------------------ |
131| event    | (event: [DragEvent](#dragevent), extraParams?: string) => void   | 是   | 回调函数。<br/>**说明:**<br/> event为拖拽事件信息,不包括拖拽点坐标。<br/> extraParams为拖拽事件额外信息,需要解析为Json格式,参考[extraParams](#extraparams说明)说明。|
132
133## onPreDrag<sup>12+</sup>
134
135onPreDrag(event: (preDragStatus: PreDragStatus) => void)
136
137绑定此事件的组件,当触发拖拽发起前的不同阶段时,触发回调。
138
139**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
140
141**系统能力:** SystemCapability.ArkUI.ArkUI.Full
142
143**参数:**
144
145| 参数名      | 类型                            | 必填 | 说明                           |
146| ----------- | ------------------------------- | ---- | ------------------------------ |
147| callback    | Callback<(preDragStatus: [PreDragStatus](#predragstatus12枚举说明)> ) => void     | 是   | 回调函数。|
148
149## DragItemInfo说明
150
151**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
152
153**系统能力:** SystemCapability.ArkUI.ArkUI.Full
154
155| 名称      | 类型                                     | 必填   | 描述                                |
156| --------- | ---------------------------------------- | ---- | --------------------------------- |
157| pixelMap  | [PixelMap](../../apis-image-kit/js-apis-image.md#pixelmap7) | 否    | 设置拖拽过程中显示的图片。 |
158| builder   | [CustomBuilder](ts-types.md#custombuilder8) | 否    | 拖拽过程中显示自定义组件,如果设置了pixelMap,则忽略此值。<br /> **说明:** <br/>不支持全局builder。如果builder中使用了[Image](ts-basic-components-image.md)组件,应尽量开启同步加载,即配置Image的[syncLoad](ts-basic-components-image.md#syncload8)为true。该builder只用于生成当次拖拽中显示的图片,builder的修改不会同步到当前正在拖拽的图片,对builder的修改需要在下一次拖拽时生效。|
159| extraInfo | string                                   | 否    | 拖拽项的描述。                           |
160
161
162## extraParams说明
163
164  用于返回组件在拖拽中需要用到的额外信息。
165
166  extraParams是Json对象转换的string字符串,可以通过Json.parse转换的Json对象获取如下属性。
167
168| 名称          | 类型   | 描述                                       |
169| ------------- | ------ | ---------------------------------------- |
170| selectedIndex | number | 当拖拽事件设在父容器的子元素时,selectedIndex表示当前被拖拽子元素是父容器第selectedIndex个子元素,selectedIndex从0开始。<br/>仅在ListItem组件的拖拽事件中生效。 |
171| insertIndex   | number | 当前拖拽元素在List组件中放下时,insertIndex表示被拖拽元素插入该组件的第insertIndex个位置,insertIndex从0开始。<br/>仅在List组件的拖拽事件中生效。 |
172
173## DragEvent
174
175**系统能力:** SystemCapability.ArkUI.ArkUI.Full
176
177### 属性
178
179**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
180
181**系统能力:** SystemCapability.ArkUI.ArkUI.Full
182
183| 名称     | 类型  | 描述             |
184| ------ | ------ | ---------------- |
185| useCustomDropAnimation<sup>10+</sup> | boolean | 当拖拽结束时,是否使能并使用系统默认落位动效。<br/>应用可将该值设定为true来禁用系统默认落位动效,并实现自己的自定义落位动效。<br/>当不配置或设置为false时,系统默认落位动效生效,当松手位置的控件可接收拖拽的数据时,落位为缩小消失动效,若不可接收数据,则为放大消失动效。<br/>当未禁用系统默认落位动效情况下,应用不应再实现自定义动效,以避免动效上的冲突。|
186|dragBehavior<sup>10+</sup> | [DragBehavior](#dragbehavior10) | 切换复制和剪贴模式的角标显示状态。 |
187
188### 方法
189
190**系统能力:** SystemCapability.ArkUI.ArkUI.Full
191
192| 名称     | 返回值类型                            | 描述                           |
193| ----------- | ------------------------------- | ------------------------------ |
194| setData(unifiedData: [UnifiedData](../../apis-arkdata/js-apis-data-unifiedDataChannel.md#unifieddata))<sup>10+</sup>       | void   | 向DragEvent中设置拖拽相关数据。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
195| getData()<sup>10+</sup> | [UnifiedData](../../apis-arkdata/js-apis-data-unifiedDataChannel.md#unifieddata) | 从DragEvent中获取拖拽相关数据。数据获取结果请参考错误码说明。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
196| getSummary()<sup>10+</sup> | [Summary](../../apis-arkdata/js-apis-data-unifiedDataChannel.md#summary) | 从DragEvent中获取拖拽相关数据的简介。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
197| setResult(dragRect: [DragResult](#dragresult10枚举说明))<sup>10+</sup> | void | 向DragEvent中设置拖拽结果。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
198| getResult()<sup>10+</sup> | [DragResult](#dragresult10枚举说明) | 从DragEvent中获取拖拽结果。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
199| getPreviewRect()<sup>10+</sup> | [Rectangle](ts-universal-attributes-touch-target.md#rectangle对象说明) | 获取拖拽跟手图相对于当前窗口的位置,以及跟手图尺寸信息,单位VP,其中x和y代表跟手图左上角的窗口坐标,width和height代表跟手图的尺寸。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
200| getVelocityX()<sup>10+</sup> | number | 获取当前拖拽的x轴方向拖动速度。坐标轴原点为屏幕左上角,单位为vp,分正负方向速度,从左往右为正,反之为负。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
201| getVelocityY()<sup>10+</sup> | number | 获取当前拖拽的y轴方向拖动速度。坐标轴原点为屏幕左上角,单位为vp,分正负方向速度,从上往下为正,反之为负。 |
202| getVelocity()<sup>10+</sup> | number | 获取当前拖拽的主方向拖动速度。为xy轴方向速度的平方和的算术平方根。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
203| getWindowX()<sup>10+</sup> | number | 当前拖拽点相对于窗口左上角的x轴坐标,单位为vp。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
204| getWindowY()<sup>10+</sup> | number | 当前拖拽点相对于窗口左上角的y轴坐标,单位为vp。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
205| getDisplayX()<sup>10+</sup> | number | 当前拖拽点相对于屏幕左上角的x轴坐标,单位为vp。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
206| getDisplayY()<sup>10+</sup> | number | 当前拖拽点相对于屏幕左上角的y轴坐标,单位为vp。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
207| getX()<sup>(deprecated)</sup> | number | 当前拖拽点相对于窗口左上角的x轴坐标,单位为vp。<br>从API Version 10开始不再维护,建议使用getWindowX()代替。 |
208| getY()<sup>(deprecated)</sup> | number | 当前拖拽点相对于窗口左上角的y轴坐标,单位为vp。<br>从API Version 10开始不再维护,建议使用getWindowY()代替。 |
209| getModifierKeyState<sup>12+</sup> | (Array&lt;string&gt;) => bool | 获取功能键按压状态。报错信息请参考以下错误码。支持功能键 'Ctrl'\|'Alt'\|'Shift'\|'Fn',设备外接带Fn键的键盘不支持Fn键查询。 <br/>**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。|
210
211
212**错误码:**
213
214以下错误码的详细介绍请参见[通用错误码](../../errorcode-universal.md)和[drag-event(拖拽事件)](../errorcode-drag-event.md)错误码。
215
216| 错误码ID   | 错误信息 |
217| --------- | ------- |
218| 401       | Parameter error. Possible causes: 1. Incorrect parameter types. 2. Parameter verification failed. |
219| 190001    | Data not found.|
220| 190002    | Data error. |
221
222## DragResult<sup>10+</sup>枚举说明
223
224**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
225
226**系统能力:** SystemCapability.ArkUI.ArkUI.Full
227
228| 名称 | 描述 |
229| ----- | ----------------- |
230| DRAG_SUCCESSFUL | 拖拽成功,在onDrop中使用。 |
231| DRAG_FAILED | 拖拽失败,在onDrop中使用。 |
232| DRAG_CANCELED | 拖拽取消,在onDrop中使用。 |
233| DROP_ENABLED | 组件允许落入,在onDragMove中使用。 |
234| DROP_DISABLED | 组件不允许落入,在onDragMove中使用。 |
235
236## DragBehavior<sup>10+</sup>
237
238当设置[DragResult](#dragresult10枚举说明)为DROP_ENABLED后,可设置DragBehavior为复制(copy)或剪切(move)。DragBehavior用来向开发者描述数据的处理方式是复制(copy)还是剪切(move),但无法最终决定对数据的实际处理方式。DragBehavior会通过onDragEnd带回给数据拖出方,发起拖拽的一方可通过DragBehavior来区分做出的是复制还是剪切数据的不同行为。
239
240**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
241
242**系统能力:** SystemCapability.ArkUI.ArkUI.Full
243
244| 名称 | 描述 |
245| ----- | ----------------- |
246| COPY | 指定对数据的处理方式为复制。|
247| MOVE| 指定对数据的处理方式为剪切。|
248
249## PreDragStatus<sup>12+</sup>枚举说明
250
251**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
252
253**系统能力:** SystemCapability.ArkUI.ArkUI.Full
254
255| 名称 | 值 | 描述 |
256| ---- | - | ----------------- |
257| ACTION_DETECTING_STATUS | 0 | 拖拽手势启动阶段。(按下50ms时触发) |
258| READY_TO_TRIGGER_DRAG_ACTION | 1 | 拖拽准备完成,可发起拖拽阶段。(按下500ms时触发) |
259| PREVIEW_LIFT_STARTED | 2 | 拖拽浮起动效发起阶段。(按下800ms时触发) |
260| PREVIEW_LIFT_FINISHED | 3 | 拖拽浮起动效结束阶段。(浮起动效完全结束时触发) |
261| PREVIEW_LANDING_STARTED | 4 | 拖拽落回动效发起阶段。(落回动效发起时触发) |
262| PREVIEW_LANDING_FINISHED | 5 | 拖拽落回动效结束阶段。(落回动效结束时触发) |
263| ACTION_CANCELED_BEFORE_DRAG | 6 | 拖拽浮起落位动效中断。(已满足READY_TO_TRIGGER_DRAG_ACTION状态后,未达到动效阶段,手指抬手时触发) |
264
265## 示例
266
267该示例展示了部分组件(如Image和Text等)拖拽和可落入区域的设置。
268
269```ts
270// xxx.ets
271import { unifiedDataChannel, uniformTypeDescriptor } from '@kit.ArkData';
272import { promptAction } from '@kit.ArkUI';
273import { BusinessError } from '@kit.BasicServicesKit';
274
275@Entry
276@Component
277struct Index {
278  @State targetImage: string = '';
279  @State targetText: string = 'Drag Text';
280  @State imageWidth: number = 100;
281  @State imageHeight: number = 100;
282  @State imgState: Visibility = Visibility.Visible;
283  @State abstractContent: string = "abstract";
284  @State textContent: string = "";
285  @State backGroundColor: Color = Color.Transparent;
286
287  @Builder
288  pixelMapBuilder() {
289    Column() {
290      Image($r('app.media.icon'))
291        .width(120)
292        .height(120)
293        .backgroundColor(Color.Yellow)
294    }
295  }
296
297  getDataFromUdmfRetry(event: DragEvent, callback: (data: DragEvent) => void) {
298    try {
299      let data: UnifiedData = event.getData();
300      if (!data) {
301        return false;
302      }
303      let records: Array<unifiedDataChannel.UnifiedRecord> = data.getRecords();
304      if (!records || records.length <= 0) {
305        return false;
306      }
307      callback(event);
308      return true;
309    } catch (e) {
310      console.log("getData failed, code = " + (e as BusinessError).code + ", message = " + (e as BusinessError).message);
311      return false;
312    }
313  }
314
315  getDataFromUdmf(event: DragEvent, callback: (data: DragEvent) => void) {
316    if (this.getDataFromUdmfRetry(event, callback)) {
317      return;
318    }
319    setTimeout(() => {
320      this.getDataFromUdmfRetry(event, callback);
321    }, 1500);
322  }
323
324  private PreDragChange(preDragStatus: PreDragStatus): void {
325    if (preDragStatus == PreDragStatus.READY_TO_TRIGGER_DRAG_ACTION) {
326      this.backGroundColor = Color.Red;
327    } else if (preDragStatus == PreDragStatus.ACTION_CANCELED_BEFORE_DRAG
328      || preDragStatus == PreDragStatus.PREVIEW_LANDING_FINISHED) {
329      this.backGroundColor = Color.Blue;
330    }
331  }
332
333  build() {
334    Row() {
335      Column() {
336        Text('start Drag')
337          .fontSize(18)
338          .width('100%')
339          .height(40)
340          .margin(10)
341          .backgroundColor('#008888')
342        Image($r('app.media.icon'))
343          .width(100)
344          .height(100)
345          .draggable(true)
346          .margin({ left: 15 })
347          .visibility(this.imgState)
348          .onDragEnd((event) => {
349            // onDragEnd里取到的result值在接收方onDrop设置
350            if (event.getResult() === DragResult.DRAG_SUCCESSFUL) {
351              promptAction.showToast({ duration: 100, message: 'Drag Success' });
352            } else if (event.getResult() === DragResult.DRAG_FAILED) {
353              promptAction.showToast({ duration: 100, message: 'Drag failed' });
354            }
355          })
356        Text('test drag event')
357          .width('100%')
358          .height(100)
359          .draggable(true)
360          .margin({ left: 15 })
361          .copyOption(CopyOptions.InApp)
362        TextArea({ placeholder: 'please input words' })
363          .copyOption(CopyOptions.InApp)
364          .width('100%')
365          .height(50)
366          .draggable(true)
367        Search({ placeholder: 'please input you word' })
368          .searchButton('Search')
369          .width('100%')
370          .height(80)
371          .textFont({ size: 20 })
372
373        Column() {
374          Text('this is abstract')
375            .fontSize(20)
376            .width('100%')
377        }.margin({ left: 40, top: 20 })
378        .width('100%')
379        .height(100)
380        .onDragStart((event) => {
381          this.backGroundColor = Color.Transparent;
382          let data: unifiedDataChannel.PlainText = new unifiedDataChannel.PlainText();
383          data.abstract = 'this is abstract';
384          data.textContent = 'this is content this is content';
385          (event as DragEvent).setData(new unifiedDataChannel.UnifiedData(data));
386        })
387        .onPreDrag((status: PreDragStatus) => {
388          this.PreDragChange(status);
389        })
390        .backgroundColor(this.backGroundColor)
391      }.width('45%')
392      .height('100%')
393
394      Column() {
395        Text('Drag Target Area')
396          .fontSize(20)
397          .width('100%')
398          .height(40)
399          .margin(10)
400          .backgroundColor('#008888')
401        Image(this.targetImage)
402          .width(this.imageWidth)
403          .height(this.imageHeight)
404          .draggable(true)
405          .margin({ left: 15 })
406          .border({ color: Color.Black, width: 1 })
407          .allowDrop([uniformTypeDescriptor.UniformDataType.IMAGE])
408          .onDrop((dragEvent?: DragEvent) => {
409            this.getDataFromUdmf((dragEvent as DragEvent), (event: DragEvent) => {
410              let records: Array<unifiedDataChannel.UnifiedRecord> = event.getData().getRecords();
411              let rect: Rectangle = event.getPreviewRect();
412              this.imageWidth = Number(rect.width);
413              this.imageHeight = Number(rect.height);
414              this.targetImage = (records[0] as unifiedDataChannel.Image).imageUri;
415              event.useCustomDropAnimation = false;
416              this.imgState = Visibility.None;
417              // 显式设置result为successful,则将该值传递给拖出方的onDragEnd
418              event.setResult(DragResult.DRAG_SUCCESSFUL);
419            })
420          })
421
422        Text(this.targetText)
423          .width('100%')
424          .height(100)
425          .border({ color: Color.Black, width: 1 })
426          .margin(15)
427          .allowDrop([uniformTypeDescriptor.UniformDataType.PLAIN_TEXT])
428          .onDrop((dragEvent?: DragEvent) => {
429            this.getDataFromUdmf((dragEvent as DragEvent), (event: DragEvent) => {
430              let records: Array<unifiedDataChannel.UnifiedRecord> = event.getData().getRecords();
431              let plainText: unifiedDataChannel.PlainText = records[0] as unifiedDataChannel.PlainText;
432              this.targetText = plainText.textContent;
433            })
434          })
435
436        Column() {
437          Text(this.abstractContent).fontSize(20).width('100%')
438          Text(this.textContent).fontSize(15).width('100%')
439        }
440        .width('100%')
441        .height(100)
442        .margin(20)
443        .border({ color: Color.Black, width: 1 })
444        .allowDrop([uniformTypeDescriptor.UniformDataType.PLAIN_TEXT])
445        .onDrop((dragEvent?: DragEvent) => {
446          this.getDataFromUdmf((dragEvent as DragEvent), (event: DragEvent) => {
447            let records: Array<unifiedDataChannel.UnifiedRecord> = event.getData().getRecords();
448            let plainText: unifiedDataChannel.PlainText = records[0] as unifiedDataChannel.PlainText;
449            this.abstractContent = plainText.abstract as string;
450            this.textContent = plainText.textContent;
451          })
452        })
453      }.width('45%')
454      .height('100%')
455      .margin({ left: '5%' })
456    }
457    .height('100%')
458  }
459}
460```
461![events-drag-drop](figures/events-drag-drop.png)
462