▼ActionScript 3.0メモ▼
ドラッグ&ドロップ


ドラッグ&ドロップを行うプログラムを作成する。



素材の準備
「sample.gif」「text.gif」をソースコードと同じフォルダに配置。

sample.gif

text.gif

ソースコード
DragDropEx.as
package {
    import flash.desktop.*;
    import flash.display.*;
    import flash.events.*;
    import flash.filesystem.*;
    import flash.geom.*;
    import flash.net.*;
    import flash.text.*;

    //ドラッグ&ドロップ
    [SWF(width=240, height=240, backgroundColor=0xFFFFFF)]
    public class DragDropEx extends Sprite {
        [Embed(source='text.gif')]
        private var TEXT:Class;
        [Embed(source='sample.gif')]
        private var SAMPLE:Class;
      
        private var lblDrag:TextField;//ドラッグラベル
        private var imgDrag:Sprite;   //ドラッグイメージ
        private var lblDrop:TextField;//ドロップラベル
        
        //コンストラクタ
        public function DragDropEx() {
            //ドラッグラベルの生成
            lblDrag = makeLabel(            
                "ドラッグ可能なテキストフィールド",
                10, 10, 220, 30);                
            lblDrag.addEventListener(
                MouseEvent.MOUSE_DOWN, onMouseDown);
            addChild(lblDrag);
            
            //ドラッグイメージの生成
            imgDrag   = new Sprite();
            imgDrag.x = 10;
            imgDrag.y = 50;
            imgDrag.addChild(new SAMPLE());           
            imgDrag.addEventListener(
                MouseEvent.MOUSE_DOWN, onMouseDown);
            addChild(imgDrag);

            //ドロップラベルの生成
            lblDrop = makeLabel(
                "ドロップ可能なテキストフィールド",
                10, 130, 220, 100);
            lblDrop.addEventListener(
                NativeDragEvent.NATIVE_DRAG_ENTER, onDragEnter);
            lblDrop.addEventListener(
                NativeDragEvent.NATIVE_DRAG_DROP, onDragDrop);
            addChild(lblDrop);
        }
        
        //ラベルの生成
        private function makeLabel(text:String,
            x:int, y:int, w:int, h:int):TextField {
            var label:TextField = new TextField();
            label.text       = text;
            label.x          = x;
            label.y          = y;
            label.width      = w;
            label.height     = h;
            label.background = true;
            label.border     = true;
            return label;            
        }

        //マウスダウンイベントの処理
        private function onMouseDown(evt:MouseEvent):void {             
            var bmp:BitmapData;

            //クリップボードの生成
            var cb:Clipboard = new Clipboard();
            
            //ラベルのドラッグ
            if (evt.target == lblDrag) {
                bmp = Bitmap(new TEXT()).bitmapData;
                cb.setData(ClipboardFormats.TEXT_FORMAT, lblDrag.text);                
                doDragStart(cb, bmp);
            }

            //イメージのドラッグ
            if (evt.target == imgDrag) { 
                bmp = Bitmap(imgDrag.getChildAt(0)).bitmapData;
                cb.setData(ClipboardFormats.BITMAP_FORMAT, bmp);
                doDragStart(cb, bmp);
            }

        }
        
        //ドラッグ開始
        private function doDragStart(cb:Clipboard, bmp:BitmapData):void {    
            //オフセット
            var offset:Point = new Point( -bmp.width / 2, -bmp.height / 2);            
            
            //ドラッグオプション
            var options:NativeDragOptions = new NativeDragOptions();
            options.allowLink=true;
            
            //ドラッグ開始
            NativeDragManager.doDrag(this, cb, bmp, offset, options);            
        }

        //ドラッグエンターイベントの処理
        public function onDragEnter(evt:NativeDragEvent):void {
            //クリップボードの取得
            var cb:Clipboard = evt.clipboard;            

            //ドラッグ可能かどうかのチェック
            if (cb.hasFormat(ClipboardFormats.TEXT_FORMAT)   || 
                cb.hasFormat(ClipboardFormats.URL_FORMAT)    || 
                cb.hasFormat(ClipboardFormats.BITMAP_FORMAT) || 
                cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) { 
                //ドロップの許可
                NativeDragManager.acceptDragDrop(lblDrop);
            }       
        }

        //ドラッグ&ドロップイベントの処理
        public function onDragDrop(evt:NativeDragEvent):void {
            //クリップボードの取得
            var cb:Clipboard = evt.clipboard;
            
            //テキストのドロップ
            if (cb.hasFormat(ClipboardFormats.TEXT_FORMAT)) { 
                lblDrop.text = "テキストのドロップ\n" + getCbText(cb);
            }
            
            //URLのドロップ
            else if (cb.hasFormat(ClipboardFormats.URL_FORMAT)) { 
                lblDrop.text = "URLのドロップ\n" + getCbText(cb);
            }            
            
            //ビットマップのドロップ
            else if (cb.hasFormat(ClipboardFormats.BITMAP_FORMAT)) {
                var bmp:Bitmap = getCbBitmap(cb);
                lblDrop.text = "ビットマップのドロップ\n" + bmp.width + "x" + bmp.height;                
            }            
            
            //ファイルリストのドロップ
            else if(cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
                var files:Array = getCbFileList(cb);
                lblDrop.text="ファイルリストのドロップ\n";
                for each (var file:File in files) {
                    lblDrop.appendText(file.nativePath+"\n");
                }
            }
        }
        
        //クリップボードテキストの取得
        private function getCbText(cb:Clipboard):String {
            return String(cb.getData(ClipboardFormats.TEXT_FORMAT));
        }
        
        //ビットマップの取得
        private function getCbBitmap(cb:Clipboard):Bitmap {
            return new Bitmap(cb.getData(
                ClipboardFormats.BITMAP_FORMAT) as BitmapData);
        }
        
        //ファイルリストの取得
        private function getCbFileList(cb:Clipboard):Array {
            return cb.getData(
                ClipboardFormats.FILE_LIST_FORMAT) as Array;
        }
    }
}




−戻る−