ホーム >> 左脳ActionScript3 >> フリーの AIR 開発環境 >> AIRプログラミング >> ドラッグ&ドロップ >> アプリケーションからのドラッグ
アプリケーションからのドラッグ
AIRアプリケーションへのドロップ処理はご理解いただけたと思います。 今度は逆に、AIRアプリケーションからPCへドロップする処理について説明します。



ドラッグ開始コード

drag.as:ドラッグ開始のコードです。

package  
{
    import flash.desktop.Clipboard;
    import flash.desktop.ClipboardFormats;
    import flash.desktop.NativeDragManager;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    /**
     * ...
     * @author 
     */
    public class drag extends Sprite
    {
        public function drag() 
        {
            graphics.beginFill(0xc0f0f0);
            graphics.moveTo(0, 0);
            graphics.lineTo(100, 0);
            graphics.lineTo(100, 100);
            graphics.lineTo(0, 100);
            graphics.endFill();
            //
            addEventListener(MouseEvent.MOUSE_DOWN, dragStart); //  ドラッグ開始のマウスボタン押下
        }
        private function dragStart(e:MouseEvent):void //    ドラッグ開始
        {
            trace("Start!");
            var c:Clipboard = new Clipboard();
            c.setData(ClipboardFormats.TEXT_FORMAT, "千葉!滋賀!佐賀!");
            //
            NativeDragManager.doDrag(this, c);
        }
    }
}
NativeDragManager.doDrag でドラッグを開始します。この時マウスボタンが押下されていないと、そもそもドラッグ開始すらされません。

これでテキストをドラッグ出来る様になりました。ブラウザのアドレスバーや、テキストエディタへドラッグして試してみて下さい。

ちょっと問題があり、嵌りかけた?のでメモしておきます。

AIRアプリを終了しても adl.exe が終了しないと言う事態に遭遇しました。
再現性があり、一度でもドラッグ作業をすると、終了時に adl.exe が固まる模様。

このコードではドラッグ開始に関するイベントが発生しますが、その処理を一切していないのです。 デバッグ実行の adl.exe にバグである可能性も否定は出来ません(FlexSDK 3.3.0.4852 の環境)が、イベント処理を記述した方が良いのかもしれません。

→そこで、イベント処理コードを追加してみました。しかし、状況に変化がありません。いよいよバグの可能性が高くなってきました。

→検索しても結果を得られず、結局 FlexSDK を更新してしまいました。
問題のあった Flex SDK は 3.3.0.4852 で、これに含まれる AIR SDK Readme.txtに、AIR SDK は 1.5 と書かれています。
http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3 で、新たに落とした Flex SDK のバージョンは 3.4.0.9271 。これに含まれる AIR SDK は、1.5.2 のようです。

SDK を新たにし、再びドラッグコードを試したところ・・・なんと、正しく adl.exe が終了するようになりました。
これにより、少なくとも「AIR SDK 1.5 の adl.exe には、NativeDragManager 周りに不具合があり、1.5.2 では改善している」と判断できる事になります。


イベント処理

このドラッグ処理で、動作によってイベントが発生します。発生しうるイベントは以下の3つです。
  • NativeDragEvent.NATIVE_DRAG_START:ドラッグの開始。
  • NativeDragEvent.NATIVE_DRAG_UPDATE:ドラッグ中。
  • NativeDragEvent.NATIVE_DRAG_COMPLETE:ドラッグの終了。
この3つのイベント処理を追加しましょう。

drag.as コンストラクタに、イベントリスナーを追加。

public function drag() 
{
    graphics.beginFill(0xc0f0f0);
    graphics.moveTo(0, 0);
    graphics.lineTo(100, 0);
    graphics.lineTo(100, 100);
    graphics.lineTo(0, 100);
    graphics.endFill();
    //
    addEventListener(MouseEvent.MOUSE_DOWN, dragStart); //  ドラッグ開始のマウスボタン押下
    //
    addEventListener(NativeDragEvent.NATIVE_DRAG_START, onDragStart);   //  ドラッグ開始
    addEventListener(NativeDragEvent.NATIVE_DRAG_UPDATE, onDragUpdate); //  ドラッグ中
    addEventListener(NativeDragEvent.NATIVE_DRAG_COMPLETE, onDragComplete); //  ドラッグ終了
}
3つ全てのイベントを記述しないと動作しないと言う事はありません。各自のアプリケーションに合った、必要なコーディングをしましょう。

イベント処理ルーチン。この例では、動作確認の為の trace 文しかありません。

private function onDragStart(e:NativeDragEvent):void 
{
    trace("DragStart!");
}
private function onDragUpdate(e:NativeDragEvent):void 
{
    trace("DragUpdate!" + e.stageX + ":" + e.stageY);
}
private function onDragComplete(e:NativeDragEvent):void 
{
    if (    e.dropAction == NativeDragActions.NONE  )
    {
        trace("Drag Failed!");  //  失敗
    }
    else
    {
        trace("Drag Succeed!"); //  成功
    }
}
NativeDragEvent.NATIVE_DRAG_UPDATE では、マウス座標をリアルタイムで監視できます。カーソルが AIRアプリケーション の外側に出ても、ドラッグ中はイベントが発生し続けます。
NativeDragEvent.NATIVE_DRAG_COMPLETE では、ドラッグが成功したかを判別できます。ドラッグ先に「ドロップ受け入れ→ペーストされる」と成功と判断されるようです。

これで、ドラッグの状況を確認出来るようになりました。




>> ドラッグの視覚効果アイコンをつけるには
ホーム >> 左脳ActionScript3 >> フリーの AIR 開発環境 >> AIRプログラミング >> ドラッグ&ドロップ >> アプリケーションからのドラッグ