支持拖出动作

Adobe AIR 1.0 和更高版本

若要支持拖出动作,必须创建一个 Clipboard 对象来响应 mouseDown 事件,并将此对象发送给 NativeDragManager.doDrag() 方法。这样,应用程序就可以侦听启动对象上发生的 nativeDragComplete 事件,以决定在用户完成或放弃此动作时要采取何种动作。

准备要传输的数据

若要准备要拖动的数据或对象,请创建一个 Clipboard 对象,然后以一种或多种格式添加要传输的信息。可以使用标准数据格式来传递可自动转换成本机剪贴板格式的数据,使用应用程序定义的格式来传递对象。

如果将要传输的信息转换为某种特定格式需要占用很大的计算开销,则可以提供用于执行这种转换的处理函数的名称。当且仅当接收组件或应用程序读取关联的格式时,才会调用此函数。

有关剪贴板格式的详细信息,请参阅剪贴板数据格式

下面的示例说明如何创建包含一个采用多种格式(Bitmap 对象、本机位图格式,以及包含最初从中加载位图的文件的文件列表格式)的位图的 Clipboard 对象:

import flash.desktop.Clipboard; 
import flash.display.Bitmap; 
import flash.filesystem.File; 
public function createClipboard(image:Bitmap, sourceFile:File):Clipboard{ 
    var transfer:Clipboard = new Clipboard(); 
    transfer.setData("CUSTOM_BITMAP", image, true); //Flash object by value and by reference 
    transfer.setData(ClipboardFormats.BITMAP_FORMAT, image.bitmapData, false); 
    transfer.setData(ClipboardFormats.FILE_LIST_FORMAT, new Array(sourceFile), false); 
    return transfer; 
}

启动拖出操作

若要启动拖动操作,请调用 NativeDragManager.doDrag() 方法来响应鼠标按下事件。doDrag() 方法是一个静态方法,它带有以下参数:

参数

说明

initiator

从中发起拖动操作且调度 dragStartdragComplete 事件的对象。initiator 必须为交互式对象。

clipboard

包含要传输的数据的 Clipboard 对象。此 Clipboard 对象在执行拖放序列期间调度的 NativeDragEvent 对象中得到引用。

dragImage

(可选)要在拖动期间显示的 BitmapData 对象。此图像可以指定 alpha 值。(注意:Microsoft Windows 始终对拖动图像应用固定的 alpha 淡化)。

offset

(可选)指定拖动图像相对于鼠标热点的偏移量的 Point 对象。使用负坐标可相对于鼠标光标向左上方移动拖动图像。如果未提供偏移量,则拖动图像的左上角将放在鼠标热点位置。

actionsAllowed

(可选)指定哪些动作(复制、移动或链接)对拖动操作有效的 NativeDragOptions 对象。如果未提供参数,则允许所有动作。在 NativeDragEvent 对象中引用 DragOptions 对象,以使潜在的拖动目标能够检查允许的动作是否与目标组件的用途一致。例如,“垃圾桶”组件可能只接受允许移动动作的拖动动作。

下面的示例说明如何对从文件加载的位图对象启动拖动操作。此示例加载一个图像,并在发生 mouseDown 事件时启动拖动操作。

package 
{ 
import flash.desktop.NativeDragManager; 
import mx.core.UIComponent; 
import flash.display.Sprite; 
import flash.display.Loader; 
import flash.system.LoaderContext; 
import flash.net.URLRequest; 
import flash.geom.Point; 
import flash.desktop.Clipboard; 
import flash.display.Bitmap; 
import flash.filesystem.File; 
import flash.events.Event; 
import flash.events.MouseEvent; 
 
public class DragOutExample extends UIComponent Sprite { 
    protected var fileURL:String = "app:/image.jpg"; 
    protected var display:Bitmap; 
 
    private function init():void { 
        loadImage(); 
    } 
    private function onMouseDown(event:MouseEvent):void { 
        var bitmapFile:File = new File(fileURL); 
        var transferObject:Clipboard = createClipboard(display, bitmapFile); 
        NativeDragManager.doDrag(this,  
                            transferObject, 
                            display.bitmapData, 
                            new Point(-mouseX,-mouseY)); 
    } 
    public function createClipboard(image:Bitmap, sourceFile:File):Clipboard { 
        var transfer:Clipboard = new Clipboard(); 
        transfer.setData("bitmap",  
                            image,  
                            true);  
                            // ActionScript 3 Bitmap object by value and by reference 
        transfer.setData(ClipboardFormats.BITMAP_FORMAT,  
                            image.bitmapData,  
                            false);  
                            // Standard BitmapData format 
        transfer.setData(ClipboardFormats.FILE_LIST_FORMAT,  
                            new Array(sourceFile),  
                            false);  
                            // Standard file list format 
        return transfer;  
    } 
    private function loadImage():void { 
        var url:URLRequest = new URLRequest(fileURL); 
        var loader:Loader = new Loader(); 
        loader.load(url,new LoaderContext()); 
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);       
    } 
    private function onLoadComplete(event:Event):void { 
        display = event.target.loader.content; 
        var flexWrapper:UIComponent = new UIComponent(); 
        flexWrapper.addChild(event.target.loader.content); 
        addChild(flexWrapper); 
        flexWrapper.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); 
    } 
} 
}

完成拖出传输

当用户通过释放鼠标放置拖动的项目时,启动器对象会调度 nativeDragComplete 事件。您可以检查事件对象的 dropAction 属性,然后采取适当的动作。例如,如果动作是 NativeDragAction.MOVE,您可以将源项目从其原始位置删除。用户可以放弃拖动动作,方法是:当光标位于符合条件的放置目标外部时,释放鼠标按键。拖动管理器将已放弃的动作的 dropAction 属性设置为 NativeDragAction.NONE