天天看點

flex拖動技術彙總

Flex元件内置了處理拖拽事件的接口,有些控件已經實作了拖拽功能,比如List、DataGrid、Menu、

HorizontalList、 PrintDataGrid、TileList、Tree,在設定相關的拖拽屬性後,它們都可以在相同類型的組

件之間利用滑鼠來實作資料的轉移。

allowDragSelection           是否可以拖選

allowMultipleSelection       是否可以多選

dragEnabled                     是否可以拖動子元素

dragMoveEnabled              是否移動元素位置,而不是複制元素

dropEnabled                     是否可以将物體放置進來

在Flex中,有幾個專門的對象供開發者處理拖拽事件:

DragManager:位于mx.managers包中,管理拖拽事件

DragSource:   位于mx.core包中,是Flex架構中的核心成員,處理拖拽中的資料傳遞

DragEvent:     位于mx.events包中,拖拽操作中的事件對象。

按照邏輯,拖拽中至少有兩個對象:一方提供資料,一方接收資料。在這個過程中,提供資料的一方按照前後 順序,可以把整個過程劃分為下面幾個事件:

mouseDown:滑鼠按下。

mouseMove:滑鼠移動。

dragComplate:滑鼠釋放。判斷目标是否接受資料,如果可以,拖放成功。

接收方也将經曆幾個階段

dragEnter:被拖動對象移動到目标範圍中。

dragDrop:滑鼠在目标上松開。

dragOver:滑鼠移動到目标上。

dragExit:獨享被拖離目标範圍。

1.   Tree與Tree之間的拖動:

Xml代碼  

<?xml version="1.0" encoding="utf-8"?>  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  
                layout="vertical"  
                verticalAlign="middle">  
  
    <mx:XML id="myData">  
        <data>  
            <item label="ActionScript">  
                <item label="Flash"/>  
                <item label="Flex"/>  
            </item>  
            <item label="Mirage">  
            </item>  
            <item label="JavaScript"/>  
        </data>  
    </mx:XML>  
  
    <mx:XML id="copyData">  
        <data>  
            <item label="JavaScript"/>  
        </data>  
    </mx:XML>  
  
    <mx:Tree dropEnabled="true"  
             dragEnabled="true"  
             dragMoveEnabled="true"  
             allowMultipleSelection="true"  
             dataProvider="{myData.item}"  
             labelField="@label"/>  
  
    <mx:Tree dropEnabled="true"  
             dataProvider="{copyData.item}"  
             labelField="@label"/>  
</mx:Application>  
 
           

上面代碼中隻需設定

dropEnabled="true" //是否可以将被拖動的物體放置進來

dragEnabled="true" //是否可以拖動子元素

dragMoveEnabled="true" //是否隻是移動元素,而不是複制元素

allowMultipleSelection="true" //是否可以多項拖動元素,為true時可以用ctrl選多個一起拖動

List與List之間的拖動,隻要設定上面的就可以了。

DataGrid 拖動到DataGrid和List

Xml代碼  

<?xml version="1.0" encoding="utf-8"?>  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  
                layout="vertical"  
                verticalAlign="middle"  
                fontSize="12">  
  
    <mx:Script>  
        <![CDATA[  
            import mx.collections.ArrayCollection;  
            import mx.events.DragEvent;  
 
            [Bindable]  
            private var mylist:ArrayCollection;  
 
            //當拖完成時  
            private function onDrop(e:DragEvent):void  
            {  
                var myData:Object=new Object();  
                myData=e.dragSource.dataForFormat('items'); //從dragSource中拿到條目  
                var name:String=myData[0].name; //注意這個地方必需要用變量進行替換  
                list1.dataProvider.addItem(name);  
                e.preventDefault(); //可以去掉預設的資料轉移  
            }  
        ]]>  
    </mx:Script>  
  
    <mx:XMLList id="employees">  
        <employee>  
            <name>劉海</name>  
            <phone>13042334532</phone>  
            <email>[email protected]</email>  
        </employee>  
        <employee>  
            <name>張春</name>  
            <phone>13642987532</phone>  
            <email>[email protected]</email>  
        </employee>  
        <employee>  
            <name>小李</name>  
            <phone>13923485844</phone>  
            <email>[email protected]</email>  
        </employee>  
    </mx:XMLList>  
  
    <mx:DataGrid x="10"  
                 y="15"  
                 width="277"  
                 id="dg"  
                 rowCount="5"  
                 dataProvider="{employees}"  
                 dragEnabled="true">  
        <mx:columns>  
            <mx:DataGridColumn headerText="Name"  
                               dataField="name"/>  
            <mx:DataGridColumn headerText="Email"  
                               dataField="email"/>  
            <mx:DataGridColumn headerText="Phone"  
                               dataField="phone"/>  
        </mx:columns>  
    </mx:DataGrid>  
  
    <mx:DataGrid dropEnabled="true">  
        <mx:columns>  
            <mx:DataGridColumn headerText="Name"  
                               dataField="name"/>  
            <mx:DataGridColumn headerText="Email"  
                               dataField="email"/>  
            <mx:DataGridColumn headerText="Phone"  
                               dataField="phone"/>  
        </mx:columns>  
    </mx:DataGrid>  
  
    <mx:List height="210"  
             width="206"  
             id="list1"  
             dropEnabled="true"  
             dataProvider="{mylist}"  
             dragDrop="onDrop(event)">  
    </mx:List>  
  
    <!--文檔注釋-->  
    <mx:TextInput width="500"  
                  height="146"  
                  horizontalCenter="0"  
                  verticalCenter="-204"  
                  fontWeight="normal"  
                  textAlign="center">  
  
        <mx:htmlText>  
            <![CDATA[  
                Date: 2009.05.05  
                Email:[email protected]  
                QQ:1019822077  
                Blog:  
                <font color="#FF0000">  
                   <a href="http://hi.baidu.com/woaidelphi/blog/category/Flex" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >  
                          http://hi.baidu.com/woaidelphi/blog/category/Flex  
                   </a>  
                </font>  
                  華夏之星希望和你成為朋友。一起學習,共同奮鬥!!!。。。  
            ]]>  
        </mx:htmlText>  
    </mx:TextInput>  
</mx:Application>  
 
           

2.非加強拖動技術

Label的拖動,可以擴充到其他元件

Xml代碼  

<?xml version="1.0" encoding="utf-8"?>  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" fontSize="12">  
<mx:Script>  
    <![CDATA[  
        import mx.collections.ArrayCollection;  
        import mx.core.IUIComponent;  
        import mx.events.DragEvent;  
        import mx.core.DragSource;  
        import mx.managers.DragManager;  
        
        [Bindable]  
        private var listData:ArrayCollection = new ArrayCollection();  
        //拖動初始器  
        private function dragSource(myData:String,e:MouseEvent,format:String):void  
        {  
           var iu:IUIComponent = e.currentTarget as IUIComponent;  
            var ds : DragSource = new DragSource();  
            ds.addData(myData,format);//設定一個标号format  
            DragManager.doDrag(iu,ds,e); // 開始拖動這個物體  
        }  
        //當拖進去時  
        private function onEnter( e:DragEvent,format:String ) : void  
        {  
            if(e.dragSource.hasFormat(format))//如果标号為format則接受拖來的物體  
            {  
                DragManager.acceptDragDrop(IUIComponent(e.target) );// 接受被拖進來的物體        
 
    
            }  
        }  
        //當拖完成時  
        private function onDrop(e:DragEvent,format:String) : void  
        {  
            var myData:Object = new Object();  
            myData = e.dragSource.dataForFormat(format);  
            list1.dataProvider.addItem(myData);//list1是List的id,要是擴充到其他元件,改這裡就可以了。  
        }  
    ]]>  
    </mx:Script>  
    <mx:Label text="拖動我到List" width="86" height="27" id="lbl" mouseDown="dragSource('這個是一個label',event,'stringFormat')"/>  
    <mx:List dataProvider="{listData}" id="list1" dragEnter="onEnter(event,'stringFormat')"  
        dragDrop="onDrop(event,'stringFormat')" width="206">  
    </mx:List>  
        <!--文檔注釋-->  
    <mx:TextInput width="500" height="146" horizontalCenter="0" verticalCenter="-204"  
        fontWeight="normal" textAlign="center">  
    <mx:htmlText>  
        <![CDATA[  
             Date: 2009.05.05  
             Email:[email protected]  
             QQ:1019822077  
             Blog:<font color="#FF0000">  
             <a href="http://hi.baidu.com/woaidelphi/blog/category/Flex" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >  
                http://hi.baidu.com/woaidelphi/blog/category/Flex  
             </a>  
             </font>  
             華夏之星希望和你成為朋友。一起學習,共同奮鬥!!!。。。  
        ]]>  
    </mx:htmlText>  
    </mx:TextInput>  
</mx:Application>  
 
           

Button的拖動,可以擴充到其他元件

Xml代碼  

<?xml version="1.0" encoding="utf-8"?>  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  
                layout="vertical"  
                verticalAlign="middle"  
                fontSize="12">  
    <mx:Script>  
        <![CDATA[  
            import mx.core.IUIComponent;  
            import mx.events.DragEvent;  
            import mx.core.DragSource;  
            import mx.managers.DragManager;  
 
            //拖動初始器  
            private function dragSource(e:MouseEvent, format:String):void  
            {  
                var iu:IUIComponent=e.currentTarget as IUIComponent;  
                var ds:DragSource=new DragSource();  
                ds.addData({"x": e.localX, "y": e.localY}, format); //設定一個标号format  
                DragManager.doDrag(iu, ds, e);  
            }  
 
            //當拖進去時  
            private function onEnter(e:DragEvent, format:String):void  
            {  
                if (e.dragSource.hasFormat(format)) //如果标号為format則接受拖來的物體  
                {  
                    DragManager.acceptDragDrop(IUIComponent(e.target));  
                }  
            }  
 
            //當拖完成時  
            private function onDrop(e:DragEvent, format:String):void  
            {  
                var myData:Object=new Object();  
                myData=e.dragSource.dataForFormat(format);  
                btn.x=this.mouseX - myData.x; //btn為按鈕的id,要是擴充到其他元件,改這裡就可以了。  
                btn.y=this.mouseY - myData.y;  
            }  
        ]]>  
    </mx:Script>  
    <mx:Canvas y="40"  
               id="cansAccess"  
               backgroundColor="#000000"  
               width="300"  
               height="200"  
               dragEnter="onEnter(event,'formatString')"  
               dragDrop="onDrop(event,'formatString')"/>  
    <mx:Button id="btn"  
               label="拖動我到面闆"  
               mouseDown="dragSource(event,'formatString')"/>  
    <!--文檔注釋-->  
    <mx:TextInput width="500"  
                  height="146"  
                  horizontalCenter="0"  
                  verticalCenter="-204"  
                  fontWeight="normal"  
                  textAlign="center">  
        <mx:htmlText>  
            <![CDATA[  
             Date: 2009.05.05  
             Email:[email protected]  
             QQ:1019822077  
             Blog:<font color="#FF0000">  
             <a href="http://hi.baidu.com/woaidelphi/blog/category/Flex" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >  
                http://hi.baidu.com/woaidelphi/blog/category/Flex  
             </a></font>  
             華夏之星希望和你成為朋友。一起學習,共同奮鬥!!!。。。  
        ]]>  
        </mx:htmlText>  
    </mx:TextInput>  
  
</mx:Application>   
           

一定要注意,标簽的先後位置,Button 要在Canvas 之後.

3.Canvas容器中拖動Box,你還可以在Box中添加圖檔等。

Xml代碼  

<?xml version="1.0" encoding="utf-8"?>  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  
                layout="absolute"  
                fontSize="12">  
    <mx:Script>  
        <![CDATA[  
            import mx.containers.Box;  
            import mx.containers.Canvas;  
            import mx.core.IUIComponent;  
            import mx.events.DragEvent;  
            import mx.managers.DragManager;  
            import mx.core.DragSource;  
 
            //拖動初始器  
            private function dragSource(e:MouseEvent, format:String):void  
            {  
                var iu:IUIComponent=e.currentTarget as IUIComponent;  
                var ds:DragSource=new DragSource();  
                ds.addData(iu, format); //設定一個标号format  
                DragManager.doDrag(iu, ds, e); // 開始拖動這個物體  
            }  
 
            //當拖進去時  
            private function onEnter(e:DragEvent, format:String):void  
            {  
                if (e.dragSource.hasFormat(format)) //如果标号為format則接受拖來的物體  
                {  
                    DragManager.acceptDragDrop(IUIComponent(e.target)); // 接受被拖進來的物體        
                }  
            }  
 
            //當拖完成時  
            private function onDrop(e:DragEvent, format:String):void  
            {  
                var box:Box=Box(e.dragInitiator); //如果擴充到其他元件,改這裡Box就可以了。  
                box.x=e.localX;  
                box.y=e.localY;  
            }  
        ]]>  
    </mx:Script>  
  
    <mx:Canvas backgroundColor="0xEEEEEE"  
               width="500"  
               height="246"  
               horizontalCenter="0"  
               verticalCenter="0"  
               dragEnter="onEnter(event,'boxFormat')"  
               dragDrop="onDrop(event,'boxFormat')">  
        <mx:Box id="boxDrag"  
                width="20"  
                height="20"  
                backgroundColor="0x00FFCC"  
                x="97"  
                y="47"  
                mouseDown="dragSource(event,'boxFormat');">  
        </mx:Box>  
    </mx:Canvas>  
    <!--文檔注釋-->  
    <mx:TextInput width="500"  
                  height="146"  
                  horizontalCenter="0"  
                  verticalCenter="-204"  
                  fontWeight="normal"  
                  textAlign="center">  
        <mx:htmlText>  
            <![CDATA[  
             Date: 2009.05.05  
             Email:[email protected]  
             QQ:1019822077  
             Blog:<font color="#FF0000">  
             <a href="http://hi.baidu.com/woaidelphi/blog/category/Flex" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >  
                http://hi.baidu.com/woaidelphi/blog/category/Flex  
             </a></font>  
               華夏之星希望和你成為朋友。一起學習,共同奮鬥!!!。。。  
        ]]>  
        </mx:htmlText>  
    </mx:TextInput>  
</mx:Application>  
 
 
           

4.圖檔的拖動

Xml代碼  

<?xml version="1.0" encoding="utf-8"?>  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  
                layout="vertical"  
                width="100%"  
                height="100%"  
                fontSize="12">  
    <mx:Script>  
        <![CDATA[  
            private var oldX:Number; //拖動開始是的坐标  
            private var oldY:Number;  
 
            //拖動開始  
            private function dragStart(event:MouseEvent):void  
            {  
                oldX=event.stageX; //相對Application的坐标  
                oldY=event.stageY;  
            }  
 
            //拖動結束  
            private function dragEnd(event:MouseEvent):void  
            {  
                lbl.text="Local (x,y):" + event.localX.toString() + "," + event.localX.toString(); //相對圖檔的坐标  
                lbl2.text="Stage (x,y):" + event.stageX.toString() + "," + event.stageY.toString(); //相對Application的坐标  
                if (event.buttonDown)  
                { //如果滑鼠在移動過程中并且按下,也就是說滑鼠的拖動事件。  
                    var x:Number=event.stageX - oldX; //相對Application的坐标的移動量  
                    var y:Number=event.stageY - oldY;  
                    oldX=event.stageX; //更新拖動開始是的坐标  
                    oldY=event.stageY;  
                    img.move(img.x + x, img.y + y); //img是 Image的id,如果擴充到其他元件,改這裡就可以了。  
                }  
            }  
        ]]>  
    </mx:Script>  
    <mx:Label x="10"  
              y="10"  
              text=""  
              id="lbl"/>  
    <mx:Label x="10"  
              y="27"  
              text=""  
              id="lbl2"/>  
    <mx:Panel x="257"  
              y="71"  
              width="700"  
              height="80%"  
              layout="absolute"  
              horizontalScrollPolicy="off"  
              verticalScrollPolicy="off"  
              title="圖檔在面闆中的拖動例子"  
              fontSize="12">  
        <mx:Image id="img"  
                  x="0"  
                  y="0"  
                  source="test.JPG"  
                  mouseMove="dragEnd(event)"  
                  mouseDown="dragStart(event)"/>  
    </mx:Panel>  
    <!--文檔注釋-->  
    <mx:TextInput width="500"  
                  height="146"  
                  fontWeight="normal"  
                  textAlign="center">  
        <mx:htmlText>  
            <![CDATA[  
             Date: 2009.05.05  
             Email:[email protected]  
             QQ:1019822077  
             Blog:<font color="#FF0000">  
             <ahref="http://hi.baidu.com/woaidelphi/blog/category/Flex" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >  
                http://hi.baidu.com/woaidelphi/blog/category/Flex  
             </a></font>  
             華夏之星希望和你成為朋友。一起學習,共同奮鬥!!!。。。  
        ]]>  
        </mx:htmlText>  
    </mx:TextInput>  
</mx:Application>  
 
           

5.從外部拖動到元件,比如從桌面上拖動一個圖檔到圖檔元件等。

因為我的flash包中沒有flash.events.NativeDragEvent等。是以這裡先不總結了。

6.引入dNdLib.swc庫讓拖動變得更簡單

Flex開放了它的拖拽庫(即:flex-drag-n-drop-lib),我們可以利用它做一些很有用的拖拽應用,下面我們

來做一個簡單的示例,按照下述的步驟,你會了解到在Flex中使用flex-drag-n-drop-lib的技巧。

1.點選這裡下載下傳SWC元件到你的桌面。

http://code.google.com/p/flex-drag-n-drop-lib/downloads/list

2.打開FlexBuilder,建立一個Flex Project,在第三步的Library Path選項中,點選Add SWC按鈕,将剛才下

載到的SWC元件引入到項目中。

3.點選Finish,在自動建立的MXML檔案中,敲入以下代碼:

Xml代碼  

<?xml version="1.0" encoding="utf-8"?>  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  
                layout="absolute"  
                xmlns:containers="dNdLib.containers.*"  
                fontSize="12">  
    <mx:Script>  
        <![CDATA[  
            import dNdLib.managers.DnDManager;  
        ]]>  
    </mx:Script>  
    <containers:DnDContainer borderStyle="solid"  
                             id="left"  
                             backgroundColor="#FFFFFF"  
                             width="161"  
                             height="237"  
                             x="110"  
                             y="168">  
        <mx:Button label="拖動我"  
                   mouseDown="DnDManager.getInstance().doDrag(event)"  
                   width="92"  
                   height="32"/>  
        <mx:CheckBox label="拖動就這麼簡單"  
                     mouseDown="DnDManager.getInstance().doDrag(event)"/>  
    </containers:DnDContainer>  
  
    <containers:DnDContainer borderStyle="solid"  
                             id="bottom"  
                             backgroundColor="#FFFFFF"  
                             x="415"  
                             y="168"  
                             width="140"  
                             height="237"/>  
</mx:Application>  
           

然後Run一下看看結果吧,元件可以拖動了。很簡單吧。

注意:必須為DnDContainer設定一個背景色(backgroundColor=color),否則可能無法産生相應區域。

轉載自:http://www.cnblogs.com/liuzhong/archive/2011/08/12/2136521.html

繼續閱讀