ホーム >> 左脳ActionScript3 >> フリーの AIR 開発環境 >> AIRプログラミング >> ドラッグ&ドロップ >> ドロップ受け入れ
ドロップ受け入れ
ドラッグされてきた物を受け入れる事が出来るならば、明示的に受け入れ可能な状態にする必要があります。 受け入れ可能状態を指定してやらないと、ドロップできません。


private function onDrag(e:NativeDragEvent):void 
{
    var c:Clipboard = e.clipboard;
    if (    c.hasFormat(ClipboardFormats.TEXT_FORMAT)   )
    {
        trace("text!");
        NativeDragManager.acceptDragDrop(this); //  受け入れ
    }
    else if (   c.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)  )
    {
        trace("File!");
    }
    else
    {
        trace("unknown!");
    }
}
flash.desktop.NativeDragManager.acceptDragDrop(対象DisplayObject) で、ドロップを受け入れる対象を指定します。

テキスト形式で受け取り可能な場合にだけ、マウスカーソルがドロップ可能な形に変化するようになりました。
これだけでも、アプリケーションの U/I として、なかなかソレっぽい形になってきました。


受け入れ処理

いよいよドロップを受け入れ、ドロップした時の処理を追加します。

drop.as

package  
{
    import flash.desktop.Clipboard;
    import flash.desktop.ClipboardFormats;
    import flash.display.Sprite;
    import flash.events.NativeDragEvent;
    import flash.desktop.NativeDragManager;
    /**
     * ...
     * @author 
     */
    public class drop extends Sprite
    {
        public function drop() 
        {
            graphics.beginFill(0xf0f0c0);
            graphics.moveTo(0, 0);
            graphics.lineTo(100, 0);
            graphics.lineTo(100, 100);
            graphics.lineTo(0, 100);
            graphics.endFill();
            //
            addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, onDrag);
            addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, onDrop); //  ドロップ処理受付
        }
        private function onDrag(e:NativeDragEvent):void 
        {
            var c:Clipboard = e.clipboard;
            if (    c.hasFormat(ClipboardFormats.TEXT_FORMAT)   )
            {
                trace("text!");
                NativeDragManager.acceptDragDrop(this); //  受け入れ
            }
            else if (   c.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)  )
            {
                trace("File!");
            }
            else
            {
                trace("unknown!");
            }
        }
        private function onDrop(e:NativeDragEvent):void //  ドロップ処理
        {
            var c:Clipboard = e.clipboard;
            var h:Object = c.getData(ClipboardFormats.TEXT_FORMAT);
            trace("-------------------------------------");
            trace(h.toString());
            trace("-------------------------------------");
        }
    }
}
NativeDragEvent.NATIVE_DRAG_DROP イベントを処理する事で、ドロップ処理の記述ができます。関数 onDrop に、ドロップされた際の処理を記述しています。

これで「通常のテキスト、HTML、URL」を、すべて文字列として受け取る事が出来るようになりました。

ここで、NATIVE_DRAG_ENTER イベント中に、Clipboard.getData でデータを取り出してはいけません。 「データをドロップした瞬間をトリガーにしてドロップデータを作成する」ようなアプリケーション(AIRでも作成可能)からのドロップで、問題が発生する可能性があるので注意してください。


ここで更にひと手間加え、「テキスト、HTML、URL」を判別するコードを書いてみました。

private function onDrop(e:NativeDragEvent):void 
{
    var c:Clipboard = e.clipboard;
    var h:Object;
    if (    c.hasFormat(ClipboardFormats.URL_FORMAT)    )
    {
        h = c.getData(ClipboardFormats.URL_FORMAT);
        trace("-------------------------------------");
        trace(h.toString());
        trace("-------------------------------------");
    }
    else if (   c.hasFormat(ClipboardFormats.HTML_FORMAT)   )
    {
        h = c.getData(ClipboardFormats.HTML_FORMAT);
        trace("-------------------------------------");
        trace(h.toString());
        trace("-------------------------------------");
    }
    else if (   c.hasFormat(ClipboardFormats.TEXT_FORMAT)   )
    {
        h = c.getData(ClipboardFormats.TEXT_FORMAT);
        trace("-------------------------------------");
        trace(h.toString());
        trace("-------------------------------------");
    }
}

ブラウザやテキストエディタ等から、いろいろドロップして見ましょう。
HTML形式では、タグがしっかり閉じられている文字列を取得する事ができます。




>> ファイルのドロップ受け入れ
ホーム >> 左脳ActionScript3 >> フリーの AIR 開発環境 >> AIRプログラミング >> ドラッグ&ドロップ >> ドロップ受け入れ