Adobe AIR中实现本地拖放

Posted by wpm on Feb 7, 2010 in 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).
现在我们可以这两个程序了并检查是否每件事都是正确的。

Tags: ,