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)); } } }