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" )]
 
    /**
     *  时间滚动组件
     * @author mmh
     */
    public class TimeStepper extends SkinnableContainerBase
    {
        /**
         *
         */
        public function TimeStepper()
        {
            super();
        }
  
  /**
   * 当前显示标签
   */  
  private var _currentTimeStr:String = "" ;

        [Bindable]
        [SkinPart(required="true")]
        /**
         *
         * @default
         */
        public var upBtn:UIComponent;

        [Bindable]
        [SkinPart(required="true")]
        /**
         *
         * @default
         */
        public var downBtn:UIComponent;

        [Bindable]
        [SkinPart(required="true")]
        /**
         *
         * @default
         */
        public var hourLabel:ItemRenderer;

        [Bindable]
        [SkinPart(required="true")]
        /**
         *
         * @default
         */
        public var minuteLabel:ItemRenderer;

        [Bindable]
        [SkinPart(required="true")]
        /**
         *
         * @default
         */
        public var secondLabel:ItemRenderer;

        //是否显示 小时
        private var _showHour:Boolean = true;

        //是否显示分钟
        private var _showMinute:Boolean = true;

        //是否显示秒
        private var _showSecond:Boolean = true;
  
        /**
         * 当前小时
         * @default
         */
        public var currentHour:Number = 0;

        /**
         * 当前分钟
         * @default
         */
        public var currentMinu:Number = 0;

        /**
         * 当前秒
         * @default
         */
        public var currentSecond:Number = 0;

        /**
         * 当前操作对象
         */
        public var currentSelected:int = 0;

        /**
         *
         * @default
         */
        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();
        }

        /**
         * 上翻
         * @param e
         *
         */
        protected function upBtnClickHandler(e:Event):void
        {
            dire = 1;

            isrun = true;
            timeFameHandler();
            timeId = setTimeout(startTimeHandler, 800);
        }


        /**
         * 下翻
         * @param e
         *
         */
        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);
        }

        /**
         * 选中 小时
         * @param e
         */
        protected function hourSelectedHandler(e:Event):void
        {
            selectedItemRender(hourLabel, 0);
        }

        /**
         * 选中分钟
         * @param e
         */
        protected function minueSelectedHandler(e:Event):void
        {
            selectedItemRender(minuteLabel, 1);
        }

        /**
         * 选中秒
         * @param e
         */
        protected function secondSelectedHandler(e:Event):void
        {
            selectedItemRender(secondLabel, 2);
        }

        /**
         * 选中某个对象
         * @param item
         * @param type
         */
        protected function selectedItemRender(item:ItemRenderer, type:int):void
        {
            if (currentItemRender)
                currentItemRender.selected = false;
            item.selected = true;
            currentItemRender = item;
            currentSelected = type;
        }

        /**
         *
         * @param e
         */
        protected function outBtnClickHandler(e:Event):void
        {
            isrun = false;
            if (timeId > 0)
                clearTimeout(timeId);
            this.removeEventListener(Event.ENTER_FRAME, timeFameHandler);
        }

        /**
         * 滚动处理
         * @param e
         */
        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);
  }

        /**
         * 补零
         * @param num
         * @return
         */
        protected function getZeroLabel(num:int):String
        {
            return num < 10 ? ("0" + num) : num + "";
        }

        /**
         * 显示小时
         */
        public function get showHour():Boolean
        {
            return _showHour;
        }

        /**
         * @private
         */
        public function set showHour(value:Boolean):void
        {
            _showHour = value;
            showUI(hourLabel, _showHour);
        }

        /**
         * 显示分
         */
        public function get showMinute():Boolean
        {
            return _showMinute;
        }

        /**
         * @private
         */
        public function set showMinute(value:Boolean):void
        {
            _showMinute = value;
            showUI(minuteLabel, _showMinute);
        }

        /**
         * 显示秒
         */
        public function get showSecond():Boolean
        {
            return _showSecond;
        }

        /**
         * @private
         */
        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);
        }

        /**
         *  显示隐藏某个组件
         * @param ui
         * @param flag
         *
         */
        protected function showUI(ui:UIComponent, flag:Boolean = true):void
        {
            if (ui)
            {
                ui.visible = flag;
                ui.includeInLayout = flag;
            }
        }
  
  /**
   * 设置 当前时间字符 02:01:20
   * @param value
   *
   */  
  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;
  }

    }
}

你可能感兴趣的:(flex,时间组件,代码片段)