10.2.指定一个拖拽代理

10.2.1 问题
你希望在拖拽开始时自定义一幅图像来表现这个被拖拽的对象。
10.2.2 解决办法
为DragManager.doDrag 方法的可选参数dragImage 指定一幅自定义图像。
10.2.3. 讨论
默认情况下,在拖拽操作中使用的图像是一个包含透明度的矩形。这个在拖操作开始时被渲染的显示对象被称为拖拽代理。通过给dragImage 参数传递一个IFlexDisplayObject 实例,你可以改变这幅图像。Flex 框架提供的绝大部分组件都能用作拖拽代理,因为它们都扩展了mx.core.UIComponent 类,而该类实现了IFlexDisplayObject 接口。虽然添加一个拖拽代理是表现物体正被移动到何处的一个简单方法,但这样做更多是为了防止不必要的误拖拽。BitmapAsset 类同样实现了IFlexDisplayObject 接口,并且它能方便地抓取应用程序中正在移动的可视对象的位图数据。

在本示例中,我们为一个拖拽操作指定一个BitmapAsset 实例作为拖拽代理:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxmllayout="horizontal">
<mx:Script>
<![CDATA[
import mx.core.BitmapAsset;
import mx.core.DragSource;
import mx.events.DragEvent;
import mx.managers.DragManager;
private var xoffset:Number;
private var yoffset:Number;
private static const FORMAT:String = "box" ;
private function mouseDownHandler(evt:MouseEvent ):void {
xoffset = evt.localX;
yoffset = evt.localY;
var initiator:Box = evt.currentTarget as Box;
var proxyBox:BitmapAsset = new BitmapAsset();
proxyBox.bitmapData = New BitmapData(initiator.width,initiator.height );
proxyBox.bitmapData.draw( initiator );
var dragSource:DragSource = new DragSource();
dragSource.addData( initiator, FORMAT );
DragManager.doDrag( initiator, dragSource, evt,proxyBox, 0, 0, 0.5 );
}
private function dragEnterHandler( evt:DragEvent ):void {
if ( evt.dragSource.hasFormat( FORMAT ) ) {
DragManager.acceptDragDrop(Canvas(evt.currentTarget));
}
}
private function dropHandler( evt:DragEvent ):void {
var box:Box = Box( evt.dragInitiator );
box.x = evt.localX - xoffset;
box.y = evt.localY - yoffset;
}

]]>
</mx:Script>
<mx:Canvas id="canvasbackgroundColor="0xEEEEEEwidth="300height="300"
dragEnter="dragEnterHandler(event);dragDrop="dropHandler(event);">

<mx:Box id="dragItemwidth="20height="20backgroundColor="0x00FFCCmouseDown="mouseDownHandler(event);" />
</mx:Canvas>
</mx:Application>

当拖操作开始mouseDownHandler 事件处理器被触发时,一幅代表拖动发起者的位图数据被复制到一个BitmapAsset 实例中。该BitmapAsset 实例被用作拖拽代理,在拖动过程中被渲染成一个50%透明的可视对象。通过在拖操作开始时记录鼠标按下的本地座标, Box 实例被拖放到具有相同偏移量的本地座标上。

你不但只可以设定一幅位图作为拖拽代理,还能指定一幅嵌入的自定义图像来表现拖拽过程中的正在被拖动的对象。

加支付宝好友偷能量挖...


评论(0)网络
阅读(95)喜欢(0)flash/flex/fcs/AIR