天天看點

flex 時間滾動元件,強大(可自行選擇時,分,秒,是否可用)

package hxht.comps.datefiled

{

    import flash.events.Event;

    import flash.events.MouseEvent;

    import flash.utils.clearTimeout;

    import flash.utils.setTimeout;

    import mx.core.UIComponent;

    import spark.components.supportClasses.ItemRenderer;

    import spark.components.supportClasses.SkinnableContainerBase;

 [Style(name="fillColors", type="Array" )]

    public class TimeStepper extends SkinnableContainerBase

    {

        public function TimeStepper()

        {

            super();

        }

  private var _currentTimeStr:String = "" ;

        [Bindable]

        [SkinPart(required="true")]

        public var upBtn:UIComponent;

        [Bindable]

        [SkinPart(required="true")]

        public var downBtn:UIComponent;

        [Bindable]

        [SkinPart(required="true")]

        public var hourLabel:ItemRenderer;

        [Bindable]

        [SkinPart(required="true")]

        public var minuteLabel:ItemRenderer;

        [Bindable]

        [SkinPart(required="true")]

        public var secondLabel:ItemRenderer;

        //是否顯示 小時

        private var _showHour:Boolean = true;

        //是否顯示分鐘

        private var _showMinute:Boolean = true;

        //是否顯示秒

        private var _showSecond:Boolean = true;

        public var currentHour:Number = 0;

        public var currentMinu:Number = 0;

        public var currentSecond:Number = 0;

        public var currentSelected:int = 0;

        public var currentItemRender:ItemRenderer;

        protected var dire:int = 1;

        protected var isrun:Boolean = false;

        public var step:Number = 1;

  //catch id

        private var timeId:int = -1;

        override protected function createChildren():void

        {

//            if (!getStyle("skinClass"))

//                this.setStyle("skinClass", TimeStepperSkin);

            super.createChildren();

            if (hourLabel)

                selectedItemRender(hourLabel, 0);

            else if (minuteLabel)

                selectedItemRender(minuteLabel, 0);

            else if (secondLabel)

                selectedItemRender(secondLabel, 0);

            refreshLabel();

        }

        protected function upBtnClickHandler(e:Event):void

        {

            dire = 1;

            isrun = true;

            timeFameHandler();

            timeId = setTimeout(startTimeHandler, 800);

        }

        protected function downBtnClickHandler(e:Event):void

        {

            dire = -1;

            isrun = true;

            timeFameHandler();

            timeId = setTimeout(startTimeHandler, 800);

        }

        private function startTimeHandler():void

        {

            clearTimeout(timeId);

            timeId = -1;

            if (isrun)

                this.addEventListener(Event.ENTER_FRAME, timeFameHandler);

        }

        protected function hourSelectedHandler(e:Event):void

        {

            selectedItemRender(hourLabel, 0);

        }

        protected function minueSelectedHandler(e:Event):void

        {

            selectedItemRender(minuteLabel, 1);

        }

        protected function secondSelectedHandler(e:Event):void

        {

            selectedItemRender(secondLabel, 2);

        }

        protected function selectedItemRender(item:ItemRenderer, type:int):void

        {

            if (currentItemRender)

                currentItemRender.selected = false;

            item.selected = true;

            currentItemRender = item;

            currentSelected = type;

        }

        protected function outBtnClickHandler(e:Event):void

        {

            isrun = false;

            if (timeId > 0)

                clearTimeout(timeId);

            this.removeEventListener(Event.ENTER_FRAME, timeFameHandler);

        }

        protected function timeFameHandler(e:Event = null):void

        {

            if (isrun)

            {

                var _num:Number = 0;

                if (currentSelected == 0)

                {

                    _num = currentHour + dire * step;

                    if (_num >= 24)

                        currentHour = 0;

                    else if (_num < 0)

                        currentHour = 23;

                    else

                        currentHour = _num;

                }

                else if (currentSelected == 1)

                {

                    _num = currentMinu + dire * step;

                    if (_num >= 60)

                        currentMinu = 0;

                    else if (_num < 0)

                        currentMinu = 59;

                    else

                        currentMinu = _num;

                }

                else if (currentSelected == 2)

                {

                    _num = currentSecond + dire * step;

                    if (_num >= 60)

                        currentSecond = 0;

                    else if (_num < 0)

                        currentSecond = 59;

                    else

                        currentSecond = _num;

                }

                refreshLabel();

            }

        }

        protected function refreshLabel():void

        {

   updateLabel() ;//重新整理标簽

   var _str:String = "" ;

   if (showHour)

    _str += getZeroLabel(currentHour) ;

   if (showMinute)

    _str +=  (_str.length>0?(":"+getZeroLabel(currentMinu)):("00:"+getZeroLabel(currentMinu))) ;

   if (showSecond)

    _str +=  (_str.length>0?(":"+getZeroLabel(currentSecond)):("00:"+getZeroLabel(currentSecond))) ;

   currentTimeStr = _str ;//重新整理 資料

        }

  protected function updateLabel( ):void

  {

   if (hourLabel)

    hourLabel.label = getZeroLabel(currentHour);

   if (minuteLabel)

    minuteLabel.label = getZeroLabel(currentMinu);

   if (secondLabel)

    secondLabel.label = getZeroLabel(currentSecond);

  }

        protected function getZeroLabel(num:int):String

        {

            return num < 10 ? ("0" + num) : num + "";

        }

        public function get showHour():Boolean

        {

            return _showHour;

        }

        public function set showHour(value:Boolean):void

        {

            _showHour = value;

            showUI(hourLabel, _showHour);

        }

        public function get showMinute():Boolean

        {

            return _showMinute;

        }

        public function set showMinute(value:Boolean):void

        {

            _showMinute = value;

            showUI(minuteLabel, _showMinute);

        }

        public function get showSecond():Boolean

        {

            return _showSecond;

        }

        public function set showSecond(value:Boolean):void

        {

            _showSecond = value;

            showUI(secondLabel, _showSecond);

        }

        override protected function partAdded(partName:String, instance:Object):void

        {

            super.partAdded(partName, instance);

            if (instance == upBtn)

            {

    upBtn.owner = this ;

    upBtn.buttonMode = true ;

                upBtn.addEventListener(MouseEvent.MOUSE_DOWN, upBtnClickHandler);

                upBtn.addEventListener(MouseEvent.MOUSE_OUT, outBtnClickHandler);

                upBtn.addEventListener(MouseEvent.MOUSE_UP, outBtnClickHandler);

            }

            else if (instance == downBtn)

            {

    downBtn.owner = this ;

    downBtn.buttonMode = true ;

                downBtn.addEventListener(MouseEvent.MOUSE_DOWN, downBtnClickHandler);

                downBtn.addEventListener(MouseEvent.MOUSE_OUT, outBtnClickHandler);

                downBtn.addEventListener(MouseEvent.MOUSE_UP, outBtnClickHandler);

            }

            else if (instance == hourLabel)

            {

                hourLabel.addEventListener(MouseEvent.CLICK, hourSelectedHandler);

    hourLabel.buttonMode = true ;

                showUI(hourLabel, _showHour);

            }

            else if (instance == minuteLabel)

            {

                minuteLabel.addEventListener(MouseEvent.CLICK, minueSelectedHandler);

    minuteLabel.buttonMode = true ;

                showUI(minuteLabel, _showMinute);

            }

            else if (instance == secondLabel)

            {

                secondLabel.addEventListener(MouseEvent.CLICK, secondSelectedHandler);

    secondLabel.buttonMode = true ;

                showUI(secondLabel, _showSecond);

            }

        }

        override protected function partRemoved(partName:String, instance:Object):void

        {

            if (instance == upBtn)

            {

                upBtn.removeEventListener(MouseEvent.MOUSE_DOWN, upBtnClickHandler);

                upBtn.removeEventListener(MouseEvent.MOUSE_OUT, outBtnClickHandler);

                upBtn.removeEventListener(MouseEvent.MOUSE_UP, outBtnClickHandler);

            }

            else if (instance == downBtn)

            {

                upBtn.removeEventListener(MouseEvent.MOUSE_DOWN, downBtnClickHandler);

                downBtn.removeEventListener(MouseEvent.MOUSE_OUT, outBtnClickHandler);

                downBtn.removeEventListener(MouseEvent.MOUSE_UP, outBtnClickHandler);

            }

            super.partRemoved(partName, instance);

        }

        protected function showUI(ui:UIComponent, flag:Boolean = true):void

        {

            if (ui)

            {

                ui.visible = flag;

                ui.includeInLayout = flag;

            }

        }

  public function set currentTimeStr( value:String ):void

  {

   if(_currentTimeStr!=value)

   {

    _currentTimeStr = value ;

    if(value)

    {

     var _arr:Array = value.split(":") ;

     if(_arr.length>=1)

      currentHour = int(_arr[0]) ;

     if(_arr.length>=2)

      currentMinu = int(_arr[1]) ;

     if(_arr.length>=3)

      currentSecond = int(_arr[2]) ;

    }

    else

    {

     currentHour = 0 ;

     currentMinu = 0 ;

     currentSecond = 0 ;

    }

    refreshLabel();

   }

  }

  [Bindable]

  public function get currentTimeStr():String

  {

   return _currentTimeStr;

  }

    }

}