实现页签可拖拽

实现类似于遨游的页签可拖拽有几个要点,继承页签的父类,刷新数据源,拖拽管理器的综合使用,数组的插删技巧。

 

package view.components

{

    import flash.events.MouseEvent;

   

    import mx.collections.ArrayCollection;

    import mx.collections.IList;

    import mx.core.DragSource;

    import mx.core.UIComponent;

    import mx.events.CollectionEvent;

    import mx.events.DragEvent;

    import mx.events.FlexEvent;

    import mx.managers.DragManager;

   

    import spark.components.TabBar;

    import spark.layouts.HorizontalLayout;

   

    import view.components.TabBarItemRenderer4;

 

    /**

     * Dragable and Draopable TabBar

     * @author 黄记新

     */

    public class SuperTabBar extends TabBar

    {

       //Indicate if tabbar item is dragable;

       private var _dragEnabled:Boolean;

       /**

        *

        * @default

        */

       protected var dragEnabledChanged:Boolean;

 

       private var _dropEnabled:Boolean;

 

       /**

        *

        * @default

        */

       protected var dataProviderChanged:Boolean;

 

       /**

        *

        */

       public function SuperTabBar()

       {

           //TODO: implement function

           super();

 

           //Add the CREATION_COMPLETE event listener

           addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);

       }

 

       /**

        * Event handler for CREATION_COMPLETE event;

        * @param event

        */

       private function onCreationComplete(event:FlexEvent):void

       {

           removeEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);

 

           updateListeners();

       }

 

       /**

        * Used to update event listeners

        */

       private function updateListeners():void

       {

           for (var i:int=0; i < this.dataGroup.numElements; i++)

           {

              var tabItem:UIComponent=UIComponent(this.dataGroup.getElementAt(i));

              if (dragEnabled && dropEnabled)

              {

                  addDragListeners(tabItem);

                  addDropListeners(tabItem);

              }

              else

                  removeDragListeners(tabItem);

           }

       }

 

       /**

        * Add relative draging event listeners

        * @param tabItem

        */

       private function addDropListeners(tabItem:UIComponent):void

       {

           tabItem.addEventListener(DragEvent.DRAG_ENTER, tabDragEnter, false, 0, true);

           tabItem.addEventListener(DragEvent.DRAG_OVER, tabDragOver, false, 0, true);

           tabItem.addEventListener(DragEvent.DRAG_DROP, tabDragDrop, false, 0, true);

           tabItem.addEventListener(DragEvent.DRAG_EXIT, tabDragExit, false, 0, true);

       }

 

       /**

        * Event handler for DRAG_ENTER event

        * @param event

        */

       private function tabDragEnter(event:DragEvent):void

       {

           if (event.dragSource.hasFormat('tabDrag') && event.dragInitiator != event.currentTarget)

           {

              DragManager.acceptDragDrop(UIComponent(event.target));

           }

       }

 

       /**

        *

        * @param event

        */

       private function tabDragOver(event:DragEvent):void

       {

           if (event.dragSource.hasFormat('tabDrag'))

           {

              var dropTab:UIComponent=(event.currentTarget as UIComponent);

              var dropIndex:Number=this.dataGroup.getElementIndex(dropTab);

           }

       }

 

       /**

        *

        * @param event

        */

       private function tabDragDrop(event:DragEvent):void

       {

           if (event.dragSource.hasFormat('tabDrag') && event.draggedItem != event.dragInitiator)

           {

              var dropTab:UIComponent=(event.currentTarget as UIComponent); //newTabItem

              var dragTab:UIComponent=(event.dragInitiator as UIComponent); //oldTabItem

 

              var oldIndex:Number=this.dataGroup.getElementIndex(dragTab);

              var newIndex:Number=this.dataGroup.getElementIndex(dropTab);

 

              if (oldIndex > newIndex)

              {

                  var object:Object=this.dataProvider.getItemAt(oldIndex);

                  this.dataProvider.addItemAt(object, newIndex);

                  this.dataProvider.removeItemAt(oldIndex + 1);

              }

              else

              {

                  var object1:Object=this.dataProvider.getItemAt(oldIndex);

                  this.dataProvider.removeItemAt(oldIndex);

                  this.dataProvider.addItemAt(object1, newIndex);

              }

 

 

              this.selectedIndex=newIndex;

             

              //In the next rendering, commitProperties method will be invoked.

              dataProviderChanged=true;

              invalidateProperties();

           }

       }

 

       /**

        *

        * @param event

        */

       private function tabDragExit(event:DragEvent):void

       {

 

       }

      

       /**

        *

        * @param tabbarItemRender

        */

       private function addDragListeners(tabbarItemRender:UIComponent):void

       {

           tabbarItemRender.addEventListener(MouseEvent.MOUSE_DOWN, tabbarItemMouseDownHandler);

           //         tabbarItemRender.addEventListener(MouseEvent.MOUSE_UP, tabbarItemMouseUpHandler);

       }

      

       /**

        *

        * @param event

        */

       private function tabbarItemMouseUpHandler(event:MouseEvent):void

       {

           UIComponent(event.currentTarget).removeEventListener(MouseEvent.MOUSE_DOWN, tabbarItemMouseDownHandler);

          

       }

      

       /**

        *

        * @param event

        */

       private function doDrag(event:MouseEvent):void

       {

           if (event.currentTarget is UIComponent)

           {

              var ds:DragSource=new DragSource();

              ds.addData(event.currentTarget, 'tabDrag');

             

              UIComponent(event.currentTarget).removeEventListener(MouseEvent.MOUSE_MOVE, doDrag);

             

              DragManager.doDrag(UIComponent(event.currentTarget), ds, event);

           }

       }

      

       /**

        *

        * @param event

        */

       private function tabbarItemMouseDownHandler(event:MouseEvent):void

       {

           UIComponent(event.currentTarget).addEventListener(MouseEvent.MOUSE_MOVE, doDrag);

       }

      

       /**

        *

        * @param tabbarItemRender

        */

       private function removeDragListeners(tabbarItemRender:UIComponent):void

       {

           tabbarItemRender.removeEventListener(MouseEvent.MOUSE_DOWN, tabbarItemMouseDownHandler);

           tabbarItemRender.removeEventListener(MouseEvent.MOUSE_UP, tabbarItemMouseUpHandler);

       }

 

       //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

       //_/_/

       //_/_/ setter and getter methods

       //_/_/

       //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

       /**

        *

        * @return

        */

       public function get dropEnabled():Boolean

       {

           return _dropEnabled;

       }

 

       /**

        *

        * @param value

        */

       public function set dropEnabled(value:Boolean):void

       {

           _dropEnabled=value;

       }

 

       /**

        *

        * @return

        */

       public function get dragEnabled():Boolean

       {

           return _dragEnabled;

       }

 

       /**

        *

        * @param value

        */

       public function set dragEnabled(value:Boolean):void

       {

           if (_dragEnabled == value)

           {

              return;

           }

 

           _dragEnabled=value;

           dragEnabledChanged=true;

           invalidateProperties();

       }

 

       //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

       //_/_/

       //_/_/ override methods

       //_/_/

       //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

 

       /**

        *

        */

       override protected function commitProperties():void

       {

           super.commitProperties();

 

           if (dataProviderChanged)

           {

              dataProviderChanged=false;

 

              updateListeners();

           }

          

       }

 

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值