支援拖出手勢

Adobe AIR 1.0 以及更新的版本

為了支援拖出手勢,您必須建立 Clipboard 物件以回應 mouseDown 事件,再將該物件傳送給 NativeDragManager.doDrag() 方法。接著,您的應用程式即可偵聽初始物件的 nativeDragComplete 事件,以決定一旦使用者完成或放棄手勢時要採取何種行動。

準備即將傳輸的資料

為了準備所要拖曳的資料或物件,請建立 Clipboard 物件並在其中加入資訊 (包括一種或多種即將傳輸的格式)。使用標準資料格式便能傳遞任何可自動轉譯成原生剪貼簿格式的資料,使用應用程式定義的格式則可傳遞物件。

如果將資訊轉換成以特定格式傳輸較耗費運算資源,您可以提供執行轉換的處理常式函數名稱。唯有當接收端組件或應用程式讀取相關聯的格式時,才會呼叫該函數。

如需有關剪貼簿格式的詳細資訊,請參閱Clipboard 資料格式

下列範例說明如何建立 Clipboard 物件以包含單一點陣圖的多種格式:Bitmap 物件、原生點陣圖格式,以及列有點陣圖載入來源檔案的檔案清單格式:

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 物件。使用負值座標可將拖曳影像往左上方移至相對於滑鼠游標的偏移位置。若未提供 offset 參數,則會將拖曳影像左上角置於滑鼠感應區。

actionsAllowed

(選擇性) 指定拖曳作業可行之動作 (複製、移動或連結) 的 NativeDragOptions 物件。若未提供此引數,則允許所有動作。DragOptions 物件是在 NativeDragEvent 物件中參考,以使可能的拖曳目標能夠檢查所允許的動作是否相容於目標組件的用途。例如,「垃圾桶」組件大致只接受允許移動動作的拖曳手勢。

下列範例說明如何對載入自檔案的點陣圖物件開始拖曳作業。此範例會載入影像,並於 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