Flex3添加拖放支持

在典型的可視化開發環境中,你能夠在應用程序中選中並且拖動一個對象在屏幕中來回移動。  Flex Drag and Drop管理器能夠讓用戶選中一個對象,比如List控件的一個元素,或者一個控件比如Image控件,並且拖動他們跨過一個元素,放到另一個元素中。所有的Flex組件支持拖放操作。Flex在拖放方面對一些控件,比如List,TreeDataGrid,都有額外的功能支持。

開始階段

用戶通過使用鼠標選中一個組件,或組件中的元素,然後按住鼠標移動組件或元素移動,來發起一個拖放操作。例如,用戶用鼠標選擇一個List控件的元素,然後按住鼠標左鍵移動幾個像素。這個被選擇的組件就叫做拖動開始點”(drag initiator)


拖動階段

當按住鼠標按鍵,用戶在Flex應用程序中移動鼠標。Flex顯示一個表示正在拖放的圖片,這個圖片代表拖放對象,就叫做拖動代理DragSource對象包含被拖動的對象。

放下階段

當一個用戶移動拖動代理劃過一個Flex組件的時候,這個組件就有可能變成放下目標放下目標可以檢查拖動源,然後決定這個數據是否是一個放下目標”(drop target)可以接受的格式,如果是,則允許用戶把數據放到它的上邊。如果不是,那麼就不允許放到它上邊。


在一個成功的放下操作中,Flex輕易的就可以增加數據到目標中,並且把原數據刪除。

 

通過設置dragEnabled屬性爲true,可以使這些控件作爲拖動開始點。類似地,通過設置dropEnabled屬性爲true,可以使這些控件作爲放下目標Flex允許通過拖動來移動元素,從dragEnabled控件到一個dropEnabled控件,或者在拖動中按住Control鍵可以賦值他們。

 

通過拖放操作複製元素

下邊的例子允許你通過拖放,從一個List控件中複製元素到另一個List控件中。你可以多次賦值同一個元素,從拖動開始點放下目標

 

<?xml version="1.0" encoding="utf-8"?>

<mx:Application
    xmlns:mx="
http://www.adobe.com/2006/mxml"
    width="365" height="225"
    creationComplete="creationCompleteHandler();"
>

    <mx:Script>
        <![CDATA[
                private function creationCompleteHandler():void
                {

                    srclist.dataProvider = ['Reading', 'Skating', 'Movies'];       
                    destlist.dataProvider = [];
                }

        ]]>
    </mx:Script>

    <mx:Panel title="Select activities" layout="horizontal">
        <mx:VBox width="50%">

            <mx:Label text="Available activities"/>

            <!-- Drag initiator -->
            <mx:List
                id="srclist" width="100%" height="100"
                allowMultipleSelection="true"               
                dragEnabled="true"

            />

        </mx:VBox>

        <mx:VBox width="50%">
            <mx:Label text="Activities I enjoy"/>

            <!-- Drop target -->
            <mx:List
                id="destlist" width="100%" height="100"
                dropEnabled="true"

            />

        </mx:VBox>
    </mx:Panel>
</mx:Application>

 

通過拖放操作移動元素

默認的時候dragMoveEnable等於false,那麼只允許你從過一個List控件複製元素到另一個List控件中。如果你修改該上邊的例子,在源List控件中,增加dragMoveEnabled屬性,並且設置爲true。那麼就向下邊的例子那樣,可以移動和複製元素了。
默認的動作是移動元素,在拖動的過程中按住Control鍵,可以複製元素。

移動而不是複製

通過拖放操作移動元素

默認的時候dragMoveEnable等於false,那麼只允許你從過一個List控件複製元素到另一個List控件中。如果你修改該上邊的例子,在源List控件中,增加dragMoveEnabled屬性,並且設置爲true。那麼就向下邊的例子那樣,可以移動和複製元素了。
默認的動作是移動元素,在拖動的過程中按住Control鍵,可以複製元素。

下邊的例子允許你通過拖放,從一個List控件中複製元素到另一個List控件中。你可以多次賦值同一個元素,從拖動開始點放下目標

例子


<!-- Drag initiator -->
<mx:List
    id="srclist" width="100%" height="100"
    allowMultipleSelection="true"               
    dragEnabled="true"

    dragMoveEnabled="true"
/>

 

雙向拖放功能

你可以允許雙向拖放,通過把兩個列表的dragEnableddropEnabled屬性都設置爲true。就像下邊:

你可以允許雙向拖放,通過把兩個列表的dragEnableddropEnabled屬性都設置爲true。就像下邊:

<!-- Both drag initiator and drop target -->
<mx:List
    id="srclist" width="100%" height="100"
    allowMultipleSelection="true"               
    dragEnabled="true"

    dropEnabled="true"
    dragMoveEnabled="true"
/>

<!-- . . . -->

<!-- Both drag initiator and drop target -->
<mx:List
    id="destlist" width="100%" height="100"
    allowMultipleSelection="true"               
    dragEnabled="true"

    dropEnabled="true"
    dragMoveEnabled="true"
/>

手工添加拖放功能
想要讓非基於list的控件或容器支持拖放操作,必須明確的添加一系列指定的類和方法。使用DragManager,DragSourceDragEvent來實現拖放操作。


Flex
應用程序使用事件來控制拖放操作。

拖動開始事件

當你把一個控制設置爲拖動開始點,你可以使用mouseDownmouseMovedragComplete事件來管理拖放操作。

關於mouseDownmouseMove事件

mouseDown事件在用戶用鼠標選中並且按下鼠標鍵開始分發。mouseMove時間在鼠標移動的時候開始分發。


下邊的例子嵌入了4個歐元硬幣(1分,2分,5分,10分)圖片,兵器使用Image控件顯示他們。在每一個Image控件中,監聽mouseMove事件並且定義事件處理器方法,這個方法被命名爲dragIt()。在dragIt()方法中,使用事件的currentTarget屬性,獲得事件源硬幣圖片的引用然後吧這個引用放入到drageInitiator這個本地變量中。


下一步,創建一個DragSource實例,並且調用她的addData()方法來保存dragIt方法的value參數。使用字符串"value"來描述value參數的格式。一會,當你創建放下目標時,你將使用這個字符串,來檢查是否允許一個元素,放到某個組件上。


想要顯示一個硬幣圖片作爲用戶拖動它的標誌,需要創建一個圖片實例,這個圖片與拖動開始點的圖片是一樣的。把這個圖片保存在dragProxy這個本地變量中

拖動時顯示的圖像


最後,調用DragManager的靜態方法doDrag(),並且把圖片發生點,拖動源,事件對象,和拖動代理類傳送給它,開始拖動操作。


你可以隨意拖動硬幣,但是在任何地方都放不下它。因爲你還沒有定義放下目標

例子


<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="
http://www.adobe.com/2006/mxml"    
    viewSourceURL="src/DragAndDropDragInitiatorEvents/index.html"

    width="500" height="160"
>
    <mx:Script>
        <![CDATA[

            import mx.managers.DragManager;
            import mx.core.DragSource;
           
            // Embed the various Euro coin images. Images originally
            // from Wikipedia (
http://en.wikipedia.org/wiki/Euro_coins)
            [Embed("assets/1c.png")]

            [Bindable]
            public var OneCent:Class;
           
            [Embed("assets/2c.png")]

            [Bindable]
            public var TwoCents:Class;
           
            [Embed("assets/5c.png")]

            [Bindable]
            public var FiveCents:Class;
           
            [Embed("assets/10c.png")]

            [Bindable]
            public var TenCents:Class;

            private function dragIt(event:MouseEvent, value:uint):void
            {

                // Get the drag initiator component from the event object.
                var dragInitiator:Image = event.currentTarget as Image;
   
                // Create a DragSource object.
                var dragSource:DragSource = new DragSource();
   
                // Add the data to the object.

                dragSource.addData(value, 'value');
   
                // Create a copy of the coin image to use as a drag proxy.
                var dragProxy:Image = new Image();
                dragProxy.source = event.currentTarget.source;
   
                // Call the DragManager doDrag() method to start the drag.

                DragManager.doDrag(dragInitiator, dragSource, event, dragProxy);
            }

        ]]>
    </mx:Script>
   
    <mx:HBox>

        <mx:Image
            id="oneCent" source="{OneCent}"
            mouseMove="dragIt(event, 1);"

        />
        <mx:Image
            id="twoCents" source="{TwoCents}"
            mouseMove="dragIt(event, 2);"

        />
        <mx:Image
            id="fiveCents" source="{FiveCents}"
            mouseMove="dragIt(event, 5);"

        />
        <mx:Image
            id="tenCents" source="{TenCents}"
            mouseMove="dragIt(event, 10);"

        />       
    </mx:HBox>
   
</mx:Application>

 

放下目標

一個放下目標可以使用多種事件,最重要的事件是dragEnter,dragDropdragExit事件。

dragEnter事件

dragEnter事件在帶有拖動代理(drag proxy)”鼠標從外部進入放下目標的時候分發。一個組件要作爲放下目標必須定義這個事件監聽器。在這個監聽器中,你可以改變放下目標的外觀,從而向用戶提供一個反饋,表明這個組件可以接受拖動操作。例如你可以在放下目標周圍畫一個框,或者給放下目標一個焦點。


dragExit
事件

dragExit事件在用戶鼠標沒有在放下目標上放下,而是移除鼠標的時候分發。如果在dragEnter或其他事件中修改了放下目標的外觀,你可以在這個事件中恢復到正常的外觀。


dragDrop
事件

dragDrop事件在用戶在放下目標上放開鼠標的時候分發。你可以使用這個事件監聽器向放下目標中增加drag的數據。

 

在下邊的例子中,創建一個Box容器擔當放下目標,並且定義dragEnter,dragExitdragDrop事件監聽器。Box容器包含一個Label控件,用來顯示放到Box上的硬幣的總和


dragEnter事件監聽器中,檢查拖動源對象中是否包含value格式。只有對象包含這個格式纔可以被放到這個放下目標上。如果包含,給用戶一個可視化的反饋,通過變粗Box容器的。通過調用DragManageracceptDrapDrop方法,告訴DragManager,Box容器要接受這個拖動開始點


dragExit的事件監聽器中,恢復Box的外觀以表明拖動代理已經不在它上邊了。


最後,在drapDrop的事件監聽器中,當用戶把硬幣放到放下目標上時獲得調用,用硬幣的值增加totalValue的值,並且回覆Box的外觀,以表明放下操作完成。

例子


<?xml version="1.0" encoding="utf-8"?>

<mx:Application
    xmlns:mx="
http://www.adobe.com/2006/mxml"
    width="525" height="270"
     viewSourceURL="src/DragAndDropDragDropTargetEvents/index.html"
>

    <mx:Script>
        <![CDATA[
            import mx.events.DragEvent;
            import mx.containers.Box;
            import mx.managers.DragManager;
            import mx.core.DragSource;
           
            // Embed the various Euro coin images. Images originally

            // from Wikipedia (http://en.wikipedia.org/wiki/Euro_coins)
            [Embed("assets/1c.png")]
            [Bindable]
            public var OneCent:Class;
           
            [Embed("assets/2c.png")]

            [Bindable]
            public var TwoCents:Class;
           
            [Embed("assets/5c.png")]

            [Bindable]
            public var FiveCents:Class;
           
            [Embed("assets/10c.png")]

            [Bindable]
            public var TenCents:Class;
           
            [Bindable]

            private var totalValue:uint;

            private function dragIt(event:MouseEvent, value:uint):void
            {

                // Get the drag initiator component from the event object.
                var dragInitiator:Image = event.currentTarget as Image;
   
                // Create a DragSource object.
                var dragSource:DragSource = new DragSource();
   
                // Add the data to the object.

                dragSource.addData(value, 'value');
   
                // Create a copy of the coin image to use as a drag proxy.
                var dragProxy:Image = new Image();
                dragProxy.source = event.currentTarget.source;
   
                // Call the DragManager doDrag() method to start the drag.

                DragManager.doDrag(dragInitiator, dragSource, event, dragProxy);
            }

            // Called if the user drags a drag proxy onto the drop target.
            private function dragEnterHandler(event:DragEvent):void
            {

                // Get the drop target component from the event object.
                var dropTarget:Box=event.currentTarget as Box;
   
                // Accept the drag only if the user is dragging data
                // identified by the 'value' format value.

                if (event.dragSource.hasFormat('value'))
                {
                    // Make the border of the Box thicker to
                    // visually signal to the user that they can
                    // drop the coin there.

                    dropTarget.setStyle("borderThickness", 5);
                   
                    // Accept the drop.
                    DragManager.acceptDragDrop(dropTarget);
                }
            }

           
            // Called if the user drags the drag proxy away from the drop target.
            private function dragExitHandler(event:DragEvent):void
            {

                // Get the drop target component from the event object.
                var dropTarget:Box=event.currentTarget as Box;               
               
                // Set the border of the Box to its default value
                // to visually indicate that the user is no longer
                // over the drop target.

                revertBoxBorder();               
            }                   
           
            // Called if the target accepts the dragged object and the user
            // releases the mouse button while over the drop target.
            private function dragDropHandler(event:DragEvent):void
            {

                // Get the data identified by the color format from the drag source.
                var value:uint = event.dragSource.dataForFormat('value') as uint;

                // Add the value to the total

                totalValue += value;
               
                // Set the border of the Box to its default value
                revertBoxBorder();               
            }
           
            // Helper method to revert the Box's border to a 1 pixel outline.
            private function revertBoxBorder():void

            {
                amountDisplay.setStyle("borderThickness", 1);               
            }
        ]]>
    </mx:Script>

   
    <mx:HBox>
        <mx:Image
            id="oneCent" source="{OneCent}"
            mouseMove="dragIt(event, 1);"

        />
        <mx:Image
            id="twoCents" source="{TwoCents}"
            mouseMove="dragIt(event, 2);"

        />
        <mx:Image
            id="fiveCents" source="{FiveCents}"
            mouseMove="dragIt(event, 5);"

        />
        <mx:Image
            id="tenCents" source="{TenCents}"
            mouseMove="dragIt(event, 10);"

        />       
    </mx:HBox>
   
    <mx:Box
        id="amountDisplay"
        borderStyle="solid" borderColor="#000000" backgroundColor="#FFFFFF"

        width="100%" height="100" horizontalAlign="center" verticalAlign="middle"

        dragEnter="dragEnterHandler(event);"

        dragExit="dragExitHandler(event);"
        dragDrop="dragDropHandler(event);"

    >
        <mx:Label text="{totalValue + &apos; pence&apos;}" fontSize="48"/>       
    </mx:Box>

   
</mx:Application>

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章