▼Adobe AIRメモ▼
ドラッグ&ドロップ

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

リソース
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.*;

    //ドラッグ&ドロップ
    public class DragDropEx extends Sprite {
        [Embed(source='text.gif')]
        private var TextImage:Class;
        [Embed(source='sample.gif')]
        private var SampleImage:Class;
      
        private var dragTextField:TextField;//ドラッグテキストフィールド
        private var dragImage:Sprite;       //ドラッグイメージ
        private var dropTextField:TextField;//ドラッグテキストフィールド
        
        //コンストラクタ
        public function DragDropEx() {
            //ドラッグテキストフィールドの生成
            dragTextField=makeTextField(
                "ドラッグ可能なテキストフィールド",
                5,5,230,20,0xFFFFFF);
            dragTextField.addEventListener(
                MouseEvent.MOUSE_DOWN,onDragStart);
            addChild(dragTextField);
            
            //ドラッグイメージの生成
            dragImage=new Sprite();
            dragImage.x=10;
            dragImage.y=40;
            dragImage.addChild(new SampleImage());           
            dragImage.addEventListener(
                MouseEvent.MOUSE_DOWN,onDragStart);
            addChild(dragImage);

            //ドロップテキストフィールドの生成
            dropTextField=makeTextField(
                "ドロップ可能なテキストフィールド",
                5,115,230,120,0xFFFFFF);
            dropTextField.addEventListener(
                NativeDragEvent.NATIVE_DRAG_ENTER,onDragEnter);
            dropTextField.addEventListener(
                NativeDragEvent.NATIVE_DRAG_DROP,onDragDrop);
            addChild(dropTextField);
        }
        
        //テキストフィールドの生成
        private function makeTextField(text:String,
            x:int,y:int,width:int,height:int,color:int):TextField {
            var textField:TextField=new TextField();
            textField.text=text;
            textField.x=x;
            textField.y=y;
            textField.width=width;
            textField.height=height;
            textField.background=true;
            textField.backgroundColor=color;
            return textField;            
        }

        //ドラッグ開始イベントの処理
        private function onDragStart(evt:MouseEvent):void {            
            var image :BitmapData;
            var offset:Point;
            var bitmap:Bitmap;

            //クリップボードオブジェクトの生成
            var cb:Clipboard=new Clipboard();
            
            //ドラッグテキストフィールドのデータ指定
            if (evt.target==dragTextField) { 
                cb.setData(ClipboardFormats.TEXT_FORMAT,dragTextField.text);
                image=Bitmap(new TextImage()).bitmapData;
                offset=new Point(-image.width/2,-image.height/2);
            }

            //ドラッグイメージのデータ指定
            if (evt.target==dragImage) { 
                bitmap=Bitmap(dragImage.getChildAt(0));
                cb.setData(ClipboardFormats.BITMAP_FORMAT,bitmap.bitmapData);
                image =bitmap.bitmapData;
                offset=new Point(-image.width/2,-image.height/2);
            }

            //ドラッグオプションの生成
            var options:NativeDragOptions=new NativeDragOptions();
            options.allowLink=true;
            
            //ドラッグの開始処理
            NativeDragManager.doDrag(this,cb,image,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(dropTextField);
            }       
        }

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

            //テキストのドロップ
            if (cb.hasFormat(ClipboardFormats.TEXT_FORMAT)) { 
                dropTextField.text="テキストのドロップ\n"+
                    String(cb.getData(ClipboardFormats.TEXT_FORMAT));
            }      
            //URLのドロップ
            else if (cb.hasFormat(ClipboardFormats.URL_FORMAT)) { 
                dropTextField.text="URLのドロップ\n"+
                    String(cb.getData(ClipboardFormats.TEXT_FORMAT));
            }            
            //ビットマップのドロップ
            else if (cb.hasFormat(ClipboardFormats.BITMAP_FORMAT)) {
                var bitmap:Bitmap=new Bitmap(cb.getData(
                    ClipboardFormats.BITMAP_FORMAT) as BitmapData);
                dropTextField.text="ビットマップのドロップ\n"+
                    bitmap.width+"x"+bitmap.height;
            }            
            //ファイルリストのドロップ
            else if(cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
                var dropfiles:Array=cb.getData(
                    ClipboardFormats.FILE_LIST_FORMAT) as Array;
                dropTextField.text="ファイルリストのドロップ\n";
                for each (var file:File in dropfiles) {
                    dropTextField.appendText(file.nativePath+"\n");
                }
            }
        }        
    }
}




−戻る−