【鸿蒙基于API 13实战开发】—— 拖拽事件_鸿蒙 ondragstart
📚鸿蒙开发往期学习笔录✒️:
✒️ 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
✒️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
✒️ 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
✒️ 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?
✒️ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
✒️ 记录一场鸿蒙开发岗位面试经历~
✒️ 持续更新中……
概述
拖拽框架提供了一种通过鼠标或手势触屏的方式传递数据,即从一个组件位置拖出数据,并拖入到另一个组件位置上进行响应,拖出一方提供数据,拖入一方接收和处理数据。该操作可以让用户方便地移动、复制或删除指定内容。
- 拖拽操作:在某个能够响应拖出的组件上长按并滑动触发的拖拽行为,当用户释放时,拖拽操作结束;
- 拖拽背景(背板):用户所拖动数据的形象化表示,开发者可通过 onDragStart 的 CustomerBuilder 或 DragItemInfo 设置,也可以通过 dragPreview 通用属性设置;
- 拖拽内容:拖动的数据,使用UDMF统一API UnifiedData 进行封装;
- 拖出对象:触发拖拽操作并提供数据的组件;
- 拖入目标:可接收并处理拖动数据的组件;
- 拖拽点:鼠标或手指等与屏幕的接触位置,是否进入组件范围的判定是以接触点是否进入范围进行判断。
拖拽流程
手势拖拽
对于手势长按触发拖拽的场景,发起拖拽前框架侧会对当前组件是否可拖拽进行校验,针对默认可拖出的组件( Search 、 TextInput 、 TextArea 、 RichEditor、Text、Image、Hyperlink)需要判断是否设置了 draggable 属性为true(若系统使能分层参数,则draggable默认为true),其他组件需要额外判断是否设置了onDragStart回调函数,在满足上述可拖拽条件下,长按大于等于500ms可触发拖拽,长按800ms开始做预览图的浮起动效。当与Menu功能一起使用,并通过isShow方式控制显隐时,不建议在用户操作800ms后再控制显示菜单,这可能会导致非预期的行为。
手势拖拽(手指/手写笔)触发拖拽流程:
鼠标拖拽
鼠标拖拽属于即拖即走,只要鼠标左键在可拖拽的组件上按下并移动大于1vp就可触发拖拽。
当前支持应用内和跨应用拖拽,提供了多个回调事件供开发者感知拖拽状态并干预系统默认拖拽行为,具体如下:
该回调可以感知拖拽行为的发起,开发者可通过在 onDragStart 方法中设置拖拽所传递的数据以及自定义拖拽背板图。推荐开发者使用pixelmap的方式返回背板图,不推荐使用customBuilder的方式,会有额外的性能开销。
在此过程中可通过 DragEvent 中的setResult方法影响系统部分场景下的外观
1. 设置DragResult.DROP_ENABLED;
2. 设置DragResult.DROP_DISABLED。
针对以下两种情况默认不会发送onDragLeave事件:
1. 父组件移动到子组件;
2. 目标组件与当前组件布局有重叠。
API version 12开始可通过 UIContext 中的 setDragEventStrictReportingEnabled 方法严格触发onDragLeave事件。
该回调也是开发者干预系统默认拖入处理行为的地方,系统会优先执行开发者的onDrop回调,通过在回调中执行setResult方法来告知系统该如何处理所拖拽的数据;
1. 设置 DragResult.DRAG_SUCCESSFUL,数据完全由开发者自己处理,系统不进行处理;
2. 设置DragResult.DRAG_FAILED,数据不再由系统继续处理;
3. 设置DragResult.DRAG_CANCELED,系统也不需要进行数据处理;
4. 设置DragResult.DROP_ENABLED或DragResult.DROP_DISABLED会被忽略,同设置DragResult.DRAG_FAILED。
开发者可以使用该方法监听 PreDragStatus 中的枚举在发起拖拽前的不同阶段准备数据。
1. ACTION_DETECTING_STATUS:拖拽手势启动阶段。(按下50ms时触发);
2. READY_TO_TRIGGER_DRAG_ACTION:拖拽准备完成,可发起拖拽阶段。(按下500ms时触发);
3. PREVIEW_LIFT_STARTED:拖拽浮起动效发起阶段。(按下800ms时触发);
4. PREVIEW_LIFT_FINISHED:拖拽浮起动效结束阶段。(浮起动效完全结束时触发);
5. PREVIEW_LANDING_STARTED:拖拽落回动效发起阶段。(落回动效发起时触发);
6. PREVIEW_LANDING_FINISHED:拖拽落回动效结束阶段。(落回动效结束时触发);
7. ACTION_CANCELED_BEFORE_DRAG:拖拽浮起落位动效中断。(已满足READY_TO_TRIGGER_DRAG_ACTION状态后,未达到动效阶段,手指抬手时触发)。
DragEvent 支持相关get方法获取拖拽行为的相关信息,下表列出了get方法在对应拖拽回调中是否能返回有效数据。