支持拖入手势

Adobe AIR 1.0 和更高版本

若要支持拖入手势,应用程序(更多情况下是应用程序的可视组件)必须响应 nativeDragEnter nativeDragOver 事件。

典型放置操作包含的步骤

放置操作通常会涉及以下事件序列:

  1. 用户将一个 Clipboard 对象拖到一个组件上方。

  2. 此组件调度 nativeDragEnter 事件。

  3. nativeDragEnter 事件处理函数检查事件对象,以查看可用的数据格式和允许的动作。如果此组件能够处理放置操作,它会调用 NativeDragManager.acceptDragDrop()

  4. NativeDragManager 更改鼠标光标,以指示可以放置此对象。

  5. 用户将此对象放在此组件上。

  6. 接收组件调度 nativeDragDrop 事件。

  7. 接收组件从事件对象内的 Clipboard 对象中读取所需格式的数据。

  8. 如果拖动手势是在 AIR 应用程序内发起的,则启动此动作的交互式对象会调度 nativeDragComplete 事件。如果此手势是在 AIR 外部发起的,则不发送回馈。

确认拖入手势

当用户将剪贴板项目拖入一个可视组件的范围内时,此组件会调度 nativeDragEnter nativeDragOver 事件。为了确定此组件是否可以接受此剪贴板项目,这些事件的处理函数会检查此事件对象的 clipboard allowedActions 属性。为了发出信号指示此组件可以接受放置操作,事件处理函数必须调用 NativeDragManager.acceptDragDrop() 方法,并在调用时传递对此接收组件的引用。如果有多个已注册的事件侦听器调用 acceptDragDrop() 方法,则列表中的最后一个处理函数优先。在鼠标离开接受对象的范围而触发 nativeDragExit 事件之前, acceptDragDrop() 调用将一直有效。

如果在传递给 doDrag() allowedActions 参数中允许多个动作,则用户可以通过按住功能键指示在这些允许的动作中他们要执行何种动作。拖动管理器更改光标图像,以此方式告知用户在他们完成拖动后将执行何种动作。要执行的动作由 NativeDragEvent 对象的 dropAction 属性予以报告。为拖动手势设置的动作仅作为建议。传输过程中涉及的组件必须实现适当的行为。例如,若要完成移动动作,拖动启动器可能会删除拖动的项目,而放置目标则可能会添加此项目。

拖动目标可以通过设置 NativeDragManager 类的 dropAction 属性,将放置动作限定为三种可能的动作之一。如果用户试图使用键盘选择其他动作,NativeDragManager 便会显示 不可用 光标。请同时在 nativeDragEnter nativeDragOver 事件的处理函数中设置 dropAction 属性。

下面的示例说明了 nativeDragEnter nativeDragOver 事件的事件处理函数。如果所拖动的剪贴板包含文本格式的数据,则此处理函数仅接受拖入手势。

import flash.desktop.NativeDragManager; 
import flash.events.NativeDragEvent; 
 
public function onDragIn(event:NativeDragEvent):void{ 
    NativeDragManager.dropAction = NativeDragActions.MOVE; 
    if(event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)){ 
        NativeDragManager.acceptDragDrop(this); //'this' is the receiving component 
    } 
}

完成放置

当用户将拖动的项目放置到已接受相应手势的交互式对象上时,此交互式对象便会调度 nativeDragDrop 事件。此事件的处理函数可以从事件对象的 clipboard 属性中提取数据。

当剪贴板包含应用程序定义的格式时,传递给 Clipboard 对象的 getData() 方法的 transferMode 参数决定拖动管理器是返回对象的引用还是序列化版本。

下面的示例展示了 nativeDragDrop 事件的事件处理函数:

import flash.desktop.Clipboard; 
import flash.events.NativeDragEvent; 
 
public function onDrop(event:NativeDragEvent):void { 
    if (event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) { 
    var text:String = 
        String(event.clipboard.getData(ClipboardFormats.TEXT_FORMAT,  
                                    ClipboardTransferMode.ORIGINAL_PREFERRED)); 
}

事件处理函数退出后,Clipboard 对象便不再有效。如有任何试图访问此对象或其数据的行为,就会产生错误。

更新组件的可视外观

组件可以根据 NativeDragEvent 事件更新其可视外观。下表说明了典型组件为响应不同事件而做出的更改的类型:

事件

说明

nativeDragStart

启动操作的交互式对象可以使用 nativeDragStart 事件来提供可视回馈,以说明拖动手势已从该交互式对象发起。

nativeDragUpdate

启动操作的交互式对象可以在手势执行过程中使用 nativeDragUpdate 事件更新其状态。(对于 Linux,AIR 中不存在此事件。)

nativeDragEnter

潜在的接收交互式对象可以使用此事件获取焦点,或者以可视方式指示其可以或不可以接受放置。

nativeDragOver

潜在的接收交互式对象可以使用此事件来响应鼠标在此交互式对象内的移动,例如,当鼠标进入诸如路线图显示这样的复杂组件的“热”区域时。

nativeDragExit

潜在的接收交互式对象可以在拖动手势移出其范围时,使用此事件来还原其状态。

nativeDragComplete

发起操作的交互式对象可以使用此事件更新其关联的数据模型(例如通过从列表中删除项目)和还原其可视状态。

在执行拖入手势期间跟踪鼠标位置

当拖动手势仍然在组件上方时,此组件便会调度 nativeDragOver 事件。每隔几毫秒就会调度这些事件;此外,只要鼠标移动,就会调度这些事件。 nativeDragOver 事件对象可用于确定鼠标在组件上方的位置。如果接收组件比较复杂,但不是由若干子组件构成的,在这种情况下,如果能访问鼠标位置,则会有帮助作用。例如,如果应用程序显示了一个包含路线图的位图,并且您希望在用户将信息拖入此图中的区域时加亮显示这些区域,则可以使用在 nativeDragOver 事件中报告的鼠标坐标来跟踪鼠标在此图中的位置。