查看: 1546|回复: 0

Flex中拖动/拖放,简明教程

[复制链接]
发表于 2009-6-9 03:36:34 | 显示全部楼层 |阅读模式
1,关于组件的拖动<br />flex里边有很多组件支持拖动,如Tree,DataGrid,TileList,Tile等,只要设置相应的属性便可进行拖动管理<br />这里针对Tree组件举个简单的例子,其它组件类似。<br />代码如下:<br />代码:
&lt;mx:XML id=&quot;myData&quot;&gt; &lt;data&gt;  &lt;item label=&quot;ActionScript&quot;&gt;   &lt;item label=&quot;Flash&quot; /&gt;   &lt;item label=&quot;Flex&quot; /&gt;  &lt;/item&gt;  &lt;item label=&quot;Mirage&quot;&gt;  &lt;/item&gt;  &lt;item label=&quot;JavaScript&quot;/&gt; &lt;/data&gt;&lt;/mx:XML&gt;&lt;mx:XML id=&quot;copyData&quot;&gt; &lt;data&gt;  &lt;item label=&quot;JavaScript&quot;/&gt; &lt;/data&gt;&lt;/mx:XML&gt;&lt;mx:Tree dropEnabled=&quot;true&quot;  dragEnabled=&quot;true&quot;  dragMoveEnabled=&quot;true&quot; allowMultipleSelection=&quot;true&quot;  dataProvider=&quot;{myData.item}&quot;   labelField=&quot;@label&quot;    dragDrop=&quot;findSource( event )&quot;  /&gt; &lt;mx:Tree  dropEnabled=&quot;true&quot;  dataProvider=&quot;{copyData.item}&quot;   labelField=&quot;@label&quot;/&gt;
[/pre]<br />上面代码中只需设置<br />dropEnabled=&quot;true&quot; //是否可以将被拖动的物体放置进来<br />dragEnabled=&quot;true&quot; //是否可以拖动子元素<br />dragMoveEnabled=&quot;true&quot; //是否只是移动元素,而不是复制元素<br />allowMultipleSelection=&quot;true&quot; //是否可以多项拖动元素<br /><br />这些属性,该组件便可拖移了,拖移之后相应的数据源 dataProvider 也发生了变化,如顺序等。而且数据相同的两个组件间也可以进行相互拖动。<br />除了这些还需注意的时如何接受被拖动进来的物体。上面代码中有个事件 dragDrop=&quot;findSource( event )&quot;<br />函数如下:<br />代码:
private function findSource( e : DragEvent ) : void{ var source : Object = e.dragSource.dataForFormat(&quot;treeItems&quot;);}
[/pre]<br />其中source指向的是被拖动的元素,而e.dragSource属DragSource类型的对象。至于&quot;treeItems&quot;字符串,各个组件代表的不同,如DataGrid的是&quot;item&quot;。<br /><br />2,拖动单个控件<br /><br />拖动单个物体需要DragEvent,DragSource,DragManager代码如下<br />代码:
&lt;mx:Canvas y=&quot;40&quot; id=&quot;cansAccess&quot; backgroundColor=&quot;#000000&quot;  width=&quot;300&quot; height=&quot;200&quot; dragDrop=&quot;complete(event)&quot; dragEnter=&quot;enter(event)&quot;/&gt;&lt;mx:Button id=&quot;btnDrag&quot; label=&quot;拖动我&quot;   mouseDown=&quot;doDrag( event )&quot; /&gt;private function doDrag( e : MouseEvent ) : void{ var ds : DragSource = new DragSource; ds.addData( {&quot;x&quot; : e.localX, &quot;y&quot; : e.localY},&quot;xy&quot;); DragManager.doDrag(btnDrag,ds,e); // 开始拖动这个物体  btnDrag}private function enter( e  ragEvent ) : void{ DragManager.acceptDragDrop( Canvas(e.target) );                 // cansAccess 接受被拖进来的物体}private function complete( e : DragEvent ) : void{ var xy : Object =  e.dragSource.dataForFormat(&quot;xy&quot;);  // 获取数据对象 也就是在doDrag函数中写的DragSource对象 btnDrag.x = this.mouseX - xy.x; btnDrag.y = this.mouseY - xy.y;}
[/pre]<br /><br />3,拖动外部文件<br />拖动外部文件需要NativeDragEvent,NativeDragManager类。其实用法和上面的DragManager一样,但是往往一个控件既要接受Flex内部被拖进来的控件,还要接受外部拖进来的文件,这时候显得就比较麻烦了。<br />但是请不要害怕,这里的Clipboard会帮我解决问题。 请看下面的代码:<br />代码:
&lt;mx:Canvas y=&quot;40&quot; id=&quot;cansAccess&quot; backgroundColor=&quot;#000000&quot;  width=&quot;300&quot; height=&quot;200&quot; dragDrop=&quot;complete(event)&quot; nativeDragDrop=&quot;nativeComplete(event)&quot; dragEnter=&quot;enter(event)&quot; /&gt;&lt;mx:Button id=&quot;btnDrag&quot; label=&quot;拖动我&quot;   mouseDown=&quot;doDrag( event )&quot; /&gt;
[/pre]<br />按理来说 当拖动内部控件的时候会触发dragDrop事件,拖动外部文件会触发nativeDragDrop事件,事实上,不管你拖动外部文件还是内部控件都会触发这两个事件。这里我们使用Clipboard来解决这一麻烦,代码如下。<br />代码:
private function doDrag( e : MouseEvent ) : void{ var ds : DragSource = new DragSource; ds.addData( {&quot;x&quot; : e.localX, &quot;y&quot; : e.localY},&quot;xy&quot;); DragManager.doDrag(btnDrag,ds,e);}private function enter( e  ragEvent ) : void{ DragManager.acceptDragDrop( Canvas(e.target) ); NativeDragManager.acceptDragDrop(Canvas(e.target));  //使其接受从外部拖进来的文件   }private function complete( e : DragEvent ) : void{   /*   */}private function nativeComplete( e : NativeDragEvent ) : void{ var filesObj : Array = e.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT ) as Array;  //获取剪切板上的文件列表 if( filesObj &amp;&amp;  filesObj.length &gt; 0)  //符合这一条件说明是从外部拖文件进来  这里假设处理拖进来的是图片 {  for each( var item : File in filesObj )   {   switch( item.extension )   {    case &quot;jpg&quot;:    case &quot;bmp&quot;:    case &quot;gif&quot;:    var img : Image = new Image;     img.source = item.nativePath;     cansAccess.addChild( img );    break;        }  } } else   //否则的话是就是在拖动内部的控件  {  var xy : Object =  e.clipboard.getData(e.clipboard.formats[0]);    //还记得doDrag 的时候附加的那个 DragSource 么?  //这里因为不能用e.dragSource.dataForFormat(&quot;xy&quot;)了因为事件不一样,  //但我们还是可以用剪切板来取得这个值  btnDrag.x =  e.localX - xy.x + cansAccess.x;  btnDrag.y =  e.localY - xy.y + cansAccess.y; }}
[/pre]<br />end......<br /><br /><blockquote class="blockquote">From: http://www.ia56.com/read-htm-tid-33.html  Powered by PHPWind.com</blockquote>
回复

使用道具 举报

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
QQ客服返回顶部