默认情况下,在拖拽操作中使用的图像是一个包含透明度的矩形。这个在拖操作开始时被 渲
染的显示对象被称为拖拽代理。通过给 dragImage 参数传递一个 IFlexDisplayObject 实例 ,
你可以改变这幅图像。 Flex 框架提供的绝大部分组件都能用作拖拽代理,因为它们都扩展
了 mx.core.UIComponent 类,而该类实现了 IFlexDisplayObject 接口。虽然添加一个拖拽
代理是表现物体正被移动到何处的一个简单方法,但这样做更多是为了防止不必要的误拖
拽。 BitmapAsset 类同样实现了 IFlexDisplayObject 接口,并且它能方便地抓取应用程序
中正在移动的可视对象的位图数据。
- <?xml version="1.0" encoding="utf-8"?>
- <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" width="100%" height="100%">
- <s:layout>
- <s:HorizontalLayout verticalAlign="middle"/>
- </s:layout>
- <fx:Declarations>
- <!-- 将非可视元素(例如服务、值对象)放在此处 -->
- </fx:Declarations>
- <fx:Script>
- <![CDATA[
- import mx.core.BitmapAsset;
- import mx.core.DragSource;
- import mx.core.IUIComponent;
- import mx.events.DragEvent;
- import mx.managers.DragManager;
- private static const FORMAT:String = "box";
- private var xoffset:Number;
- private var yoffset:Number;
- private function mouseDownHandle(evt:MouseEvent):void {
- xoffset = evt.localX;
- yoffset = evt.localY;
- var initiator:Box = evt.currentTarget as Box;
- //BitmapAsset 是 flash.display.Bitmap 类的子类,表示您在 Flex 应用程序中嵌入的位图图像
- var proxyBox:BitmapAsset = new BitmapAsset();
- //Bitmap 类表示用于表示位图图像的显示对象。
- proxyBox.bitmapData = new BitmapData(initiator.width, initiator.height);
- proxyBox.bitmapData.draw(initiator);
- //DragSource 类中包含正被拖动的数据
- var dragSource:DragSource = new DragSource();
- //addData(data:Object, format:String):void向拖动源添加数据和相应的格式 String。
- dragSource.addData(initiator, FORMAT);
- //启动拖放操作。
- //dragInitiator:IUIComponent — 指定启动拖动的组件的 IUIComponent。
- //dragSource:DragSource — 包含正在拖动的数据的 DragSource 对象。
- //mouseEvent:MouseEvent — 包含与启动拖动相关的鼠标信息的 MouseEvent
- DragManager.doDrag(initiator, dragSource, evt, proxyBox, 0, 0, 0.5);
- }
- private function dragEnterHandle(evt:DragEvent):void {
- //如果数据源中包含请求的格式,则返回 true;否则,返回 false。
- if(evt.dragSource.hasFormat(FORMAT)) {
- DragManager.acceptDragDrop(Canvas(evt.currentTarget));
- }
- }
- private function dropHandle(evt:DragEvent):void {
- //确定拖动后的位置
- var box:Box = Box(evt.dragInitiator);
- box.x = evt.localX - xoffset;
- box.y = evt.localY - yoffset;
- }
- ]]>
- </fx:Script>
- <mx:Canvas id="canvas"
- backgroundColor="0xEEEEEE"
- width="80%" height="80%"
- dragEnter="dragEnterHandle(event);"
- dragDrop="dropHandle(event);">
- <mx:Box id="dragItem"
- width="20%" height="20%"
- backgroundColor="0x00FFCC"
- mouseDown="mouseDownHandle(event);" />
- </mx:Canvas>
- </s:Application>