Adobe AIR中实现本地拖放
在这篇自学材料中,我们将学习Adobe AIR中最简单的本地拖放操作,这有两个例子:
1.从一个本地应用程序中(如:FireWorks),拖拽一张图片到一个AIR程序中。
2.从一个AIR应用程序中拖拽一张图片到另一个AIR程序中。
首先我们来实现可以接受释放操作的目标应用程序。要实现这个功能,必须要说明以下两个行为:
一是当有一物体被拖到应用程序之上时应该做些什么;
二是当有释放动作时应该做些什么。
这些通过两个事件来协调控制:nativeDragEnter 和 nativeDragDrop,他们都是属于WindowedApplication的类。
代码:
<mx:WindowedApplication
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
nativeDragEnter="dragEnterHandler(event)"
nativeDragDrop="dropHandler(event)">
</mx:WindowedApplication>
一旦关联了处理方法,我们需要定义这些方法。
<mx:Script>
<![CDATA[
private function dragEnterHandler(e:NativeDragEvent):void {
if (e.clipboard.hasFormat(ClipboardFormats.BITMAP_FORMAT)) {
NativeDragManager.acceptDragDrop(this);
}
}
private function dropHandler(e:NativeDragEvent):void {
var data:BitmapData = e.clipboard.getData(ClipboardFormats.BITMAP_FORMAT) as BitmapData;
var myBit:Bitmap = new Bitmap(data);
stage.addChild(myBit);
}
]]>
</mx:Script>
在nativeDragEnter事件发生时,我们必须检测拖拽的对象是否是BITMAP类型的,如果是就可以接受拖拽。
在拖拽的过程中,拖拽对象的一个拷贝被存储到系统的剪切板中。在目标程序中实现复制拖拽对象时,我们必须先读取它,克隆它
并最后将它加入到现实对象树中。这便是我们在目标应用程序中需要做的。现在我们已经可以测试下这个程序了,
让我们运行它,打开FIREWORKS中的某一图片,将它拖拽并释放到AIR程序上……
现在让我们来看下另一个例子:我们将一幅图片从另一个AIR程序中拖拽到当前AIR程序中。
这里我们必须模仿FIREWORKS以上的这些行为:当开始拖拽动作时将图片复制到系统剪切板中。
让我们先添加一张图片到应用程序中。
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Image id="image" source="logo.png" mouseDown="startDragDrop(event)"/> </mx:WindowedApplication>正如你所见的,我们在鼠标按下事件发生时触发了一个方法。现在让我们来定义该方法:<mx:Script> <![CDATA[ private function startDragDrop(e:MouseEvent):void { var data:BitmapData = new BitmapData(image.width, image.height); data.draw(image); // create my clipboard object to be passed to dragmanager var cb:Clipboard = new Clipboard(); cb.setData(ClipboardFormats.BITMAP_FORMAT, data); // data here is a 'representative' of the dragged object during dragging. NativeDragManager.doDrag(this, cb, data); } ]]> </mx:Script>我们创建了图片的副本 (lines 25-26). 我们在两个案例中使用了:将图片放入剪切板中 (line 30) 并在释放时提供了反馈 (line 33).现在我们可以这两个程序了并检查是否每件事都是正确的。