AIR文件的拖放,分为从操作系统脱文件到AIR窗体中和在AIR窗体内部拖放以及从AIR窗体内部拖动对象操作系统中。无论怎么拖,上拖下拖,都得有个被拖动对象和接受拖动的对象。不过,在这个中间,有个好东西,叫做Clipboard。这个就像一个临时存储器一样,你拖什么,我存着。

    拖拽的过程,我们分三个阶段。启动,拖动,放下。

            先侦听到NativeDragEvent.NATIVE_DRAG_ENTER事件,在这里可以检测数据格式,以决定是否允许接受该数据格式。如果是允许的数据格式,我们可以调用NativeDragManager.acceptDragDrop()方法,允许该数据在组件上放下。这个时候屏幕上光标的形状会有所变化。

    然后会侦听到NativeDragEvent.NATIVE_DRAG_OVER事件。这个时候,开始进行拖动了。当拖动到符合放置目标时,松开鼠标。这个时候就是放下的时候,会触发NativeDragEvent.NATIVE_DRAG_DROP事件。在这里,我们可以处理Clipboard里边的数据。

    中间有个变故。如果拖动到符合放置目标上后,没有松开鼠标,继续他拖动,然后脱离符合放置的目标,这个时候会触发NativeDragEvent.NATIVE_DRAG_EXIT事件。

           今天这里先说AIR内部的拖放。

     我们先准备被拖动对象,这里我们用一个Bitmap对象,假如是加载进来的一个图片。加载成功后,把它的bitmap给一个Spirte,用Sprite侦听鼠标按下事件。这样做是让我们去启动拖动

操作。当我们按下鼠标拖动的时候,我们要做的事情就是创建一个Clipboard。总有点东西吧,于是,就把加载进来的Bitmap的bitmapdata给它。这里我们用setData方法。setData方法呢有三个

参数,第一个参数用来表示数据的格式,第二个参数是一个object对象,就是添加的数据。第三个对象为可以序列化(和反序列化)的对象指定 true。第一个参数和第二个参数关系很重要吧。假如第一个参数是ClipboardFormats.BITMAP_FORMAT,那么第二个参数就用bitmapdata。这里支持的数据类型有:

ClipboardFormats.BITMAP_FORMAT : String = “air:bitmap” [静态] 图像数据(仅限 AIR)。

ClipboardFormats.FILE_LIST_FORMAT : String = “air:file list” [静态] 文件数组(仅限 AIR)。

ClipboardFormats.FILE_PROMISE_LIST_FORMAT : String = “air:file promise list” [静态] 文件承诺列表(仅 AIR)。

ClipboardFormats.HTML_FORMAT : String = “air:html” [静态] HTML 数据。

ClipboardFormats.RICH_TEXT_FORMAT : String = “air:rtf” [静态] RTF 格式数据。

ClipboardFormats.TEXT_FORMAT : String = “air:text” [静态] 字符串数据。

ClipboardFormats.URL_FORMAT : String = “air:url” [静态] URL 字符串(仅限 AIR)。

    做好setData后,NativeDragManager开始做事了。它呀,怎么做呢,用doDrag方法,该方法有5个参数。第一个参数符合放置目标,第二个参数刚创建的Clipboard,就是要传输

的数据,第三个参数是一个Bitmapdata对象,该对象作为拖动期间的代理图像,第四个参数是鼠标移动的位置的Point对象,第五个啊啊啊了。

           做好这些后,开始拖动吧,拖动吧。然后,遇到符合放置的目标,松开你的手吧,不用再留恋了。然后符合放置目标会接受到NativeDragEvent.NATIVE_DRAG_DROP事件。然后就去将接受

的数据(Clipboard)中取出来,getData.然后,想干嘛就干嘛吧。这里不啰嗦,贴出code。

 

其中,setData时候,参数format是ClipboardFormats.BITMAP_FORMAT时,getData获取的值是深复制,想要浅复制。随便定义一个字符串就可以了。setData和getData统一就好。这个比自定义事件更方便。

package com.vini123
{
    import flash.display.Sprite;
    import flash.events.NativeDragEvent;
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    import flash.desktop.Clipboard;
    import flash.desktop.ClipboardFormats;
    import flash.desktop.NativeDragManager;
    import flash.geom.Point;
    import flash.display.BitmapData;
    import flash.geom.Matrix;

    [SWF(width = "256",height = "360",frameRate = "30")]
    public class Main extends Sprite
    {
        private var _sp:Sprite;
        private var _woyunle:Sprite;
        private var _bitmap:Bitmap;
        private var _bitmapData:BitmapData;

        private var _picW:int = 150;
        private var _picH:int = 100;


        public function Main():void
        {
            _woyunle = new Sprite();
            addChild(_woyunle);
            
            _sp = new Sprite();
            _sp.graphics.beginFill(0x00ffff,0.25);
            _sp.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight * 0.2);
            _sp.graphics.endFill();
            addChild(_sp);
            _sp.y = stage.stageHeight * (1 - 0.2);
            readyReceiveThing();
            readyDragThing();
        }

        private function readyReceiveThing():void
        {
            _sp.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,dragEnterHandler);
            _sp.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP,dragDropHandler);
            _sp.addEventListener(NativeDragEvent.NATIVE_DRAG_EXIT,dragExitHandler);
            _sp.addEventListener(MouseEvent.CLICK,clickHandler);
        }

        private function dragEnterHandler(e:NativeDragEvent):void
        {
            trace("dragEnterHandler")
            var clipBoard:Clipboard = e.clipboard;
            if(clipBoard.hasFormat(ClipboardFormats.BITMAP_FORMAT) ||
               clipBoard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)
               )
            {
                NativeDragManager.acceptDragDrop(_sp);
            }
        }

        private function dragDropHandler(e:NativeDragEvent):void
        {
            trace("dragDropHandler")
            var _reBitmapdata:BitmapData = e.clipboard.getData(ClipboardFormats.BITMAP_FORMAT) as BitmapData;
            var _reBitmap:Bitmap = new Bitmap();
            _reBitmap.bitmapData = _reBitmapdata;
            var _scale:Number = _sp.height/_reBitmap.height;
            _reBitmap.scaleX = _scale;
            _reBitmap.scaleY = _scale;
            _sp.addChild(_reBitmap);
            _reBitmap.x = (_sp.numChildren -1) * _reBitmap.width;
        }
        
        private function clickHandler(e:MouseEvent):void
        {
            if(_sp.numChildren>0)
            {
                var _delBitmap:Bitmap = _sp.getChildAt((_sp.numChildren -1)) as Bitmap;
                _sp.removeChild(_delBitmap);
                _delBitmap.bitmapData.dispose();
            }
        }
        
        private function dragExitHandler(e:NativeDragEvent):void
        {
            trace("dragExitHandler");
        }

        private function readyDragThing():void
        {
            var myLoader:Loader = new Loader();
            var myRequest:URLRequest = new URLRequest();
            myRequest.url ="http://s0.hao123img.com/res/r/image/2013-07-11/4eed0e556091f6e8e81fd01c645c9f7b.jpg";// "01.jpg";
            myLoader.load(myRequest);
            myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
        }

        private function completeHandler(e:Event):void
        {
            e.target.removeEventListener(Event.COMPLETE,completeHandler);
            _bitmap = e.target.content as Bitmap;
            _woyunle.addChild(_bitmap);
            var _scale:Number;
            if ((_picW/_picH) > _bitmap.width /_bitmap.height)
            {
                _scale = _picW / _bitmap.width;
            }
            else
            {
                _scale = _picH / _bitmap.height;
            }
            _bitmap.scaleX = _scale;
            _bitmap.scaleY = _scale;
            _bitmap.x = stage.stageWidth * 0.5 - _bitmap.width * 0.5;
            _bitmap.y = 10;
            _woyunle.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
            _woyunle.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER,function (e:NativeDragEvent)
                                      {
                                         NativeDragManager.acceptDragDrop(_sp);
                                       }
                                       )
        }

        private function mouseDownHandler(e:MouseEvent):void
        {
            var _clipBoard:Clipboard = new Clipboard();
            _clipBoard.setData(ClipboardFormats.BITMAP_FORMAT,_bitmap.bitmapData,true);
            if(_bitmapData)
            {
                _bitmapData.dispose();
            }
            _clipBoard.setData(
            _bitmapData = new BitmapData(_bitmap.width,_bitmap.height,true,0);
            var _matrix:Matrix = new Matrix();
            _matrix.scale(_bitmap.scaleX,_bitmap.scaleY);
            _bitmapData.draw(_bitmap,_matrix);
            NativeDragManager.doDrag(_sp,_clipBoard,_bitmapData,new Point(-mouseX,-mouseY));
        }
    }
}