Flex “跑马灯”效果(自定义“跑马灯”控件)

自定义类(BroadCastMarquee.as):

 

package marquee
{
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.geom.Rectangle;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.utils.Timer;
    
    import mx.core.UIComponent;
    
    /** 
    *  
      * 信息滚动显示(跑马灯控件) 
      * @version 
    * <pre> 
    * 修改版本: 1.0.0 
    * 修改日期:2009-1-15 
    * 修改人 : zhang 
    * 修改说明:形成初始版本 
    *</pre>  
       *  
    * * 功能: 
    * 1.直接将某TextField转换为跑马灯文本 changeTextFieldToMarqueeText  
    * 2.动态设定显示宽度 width 
    * 3.动态设定一次移动间隔时间 delay 
    * 4.动态设定一次移动间隔距离 step 
    * 5.设定默认文本显示样式 defaultTextFormat 
    * 6.动态设定文本显示样式 setTextFormat 
    * */  
    public class BroadCastMarquee extends UIComponent  
      {  
         
          [Bindable]  
           private var broadcastText:String="broadcast message";  
        
           private var m_timer:Timer;  
        
           private var m_DefaultText_X:Number=0;  
          
           //每次移动距离  
        private var m_step:Number=10;  
            
           //滚动范围  
        private var m_rect:Rectangle;  
            
        //移动时间间隔  
        private var t_delay:Number=100;  
            
        //广播信息滚动宽度  
        private var m_Width:Number;  
         
        //滚动方向属性  
        [Inspectable(defaultValue="left",enumeration="right,left", category="direction", type="String")]  
        public var ScrollDirection:String="left";  
         
         
           //显示内容样式  
           [Bindable]  
           private var m_TextFormat:TextFormat=new TextFormat("Verdana","10","#0b333c");  
         
       /**广播信息内容显示控件*/  
       private var m_BroadCastText:TextField;  
        
      // private var m_BroadcastLabel:Label;  
         
       public function BroadCastMarquee()  
       {  
           super();  
             
           InitBroadcast();  
             
           addEventListener(MouseEvent.MOUSE_OVER,rollOverHandler);  
           addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);  
             
       }  
         
       /**初始化*/  
       private function InitBroadcast():void  
       {  
           /**广播信息显示控件初始化*/  
           m_BroadCastText=new TextField();  
           m_BroadCastText.autoSize=TextFieldAutoSize.LEFT;  
           m_BroadCastText.multiline=false;  
           m_BroadCastText.selectable=false;  
           m_BroadCastText.x=m_BroadCastText.y=m_DefaultText_X  
           m_BroadCastText.wordWrap=false;  
           m_BroadCastText.text=broadcastText;  
           //m_BroadCastText.defaultTextFormat=m_TextFormat;  
           addChild(m_BroadCastText);  
             
             
           this.m_Width=this.width;  
           m_rect=new Rectangle(0,0,this.width,this.m_BroadCastText.textHeight);  
           this.m_BroadCastText.scrollRect=m_rect;  
              
              m_timer = new Timer(t_delay);  
                
             ScrollBroadText();  
                
             
           }   
         
       /** 
        * 如果有新的广播消息,或者长度改变进行滚动显示 
        * */  
           private function ScrollBroadText():void  
          {  
           if(this.m_timer!=null)  
          {  
                  //停止移动  
               StopMoveBroadcast();  
                 
               if(this.broadcastText!="")  
               {  
                   m_timer.addEventListener(TimerEvent.TIMER, timerhandler);  
                   m_timer.start();  
               }  
              // Math.abs(  
                   
          }  
          }  
        
      /**控制滚动信息*/  
          private function timerhandler(evt:TimerEvent):void  
        {  
          if(this.m_BroadCastText.textWidth>0)  
          {  
                
             if(ScrollDirection.toLowerCase()=="left")  
               {  
                    
                    if(m_rect.x<=this.m_BroadCastText.textWidth)  
                     {  
                      //  this.m_BroadCastText.x+=(-this.m_step);  
                       m_rect.x+=this.m_step;  
                          
                     }else  
                     {  
                        //this.m_BroadCastText.x=m_DefaultText_X+this.m_BroadCastText.textWidth;  
                        m_rect.x=-(m_DefaultText_X+this.m_Width);  
                     }  
                       
    
              }else  
              {  
                  
                 if(Math.abs(m_rect.x)<=this.m_BroadCastText.textWidth)  
                 {  
                     m_rect.x-=this.m_step;  
                      
                 }else  
                 {  
                    this.m_rect.x=m_DefaultText_X;  
                     
                 }  
                  
            }  
             
           m_BroadCastText.scrollRect = m_rect;    
             
         }else  
         {  
             //停止移动  
             StopMoveBroadcast();  
          }  
           
           
              
            }  
          
        /**停止移动*/  
             private function StopMoveBroadcast():void  
            {  
                 if(m_timer!=null)  
          {  
            this.m_timer.stop();  
             if(m_timer.hasEventListener(TimerEvent.TIMER))  
                 m_timer.removeEventListener(TimerEvent.TIMER, timerhandler);  
                
               m_BroadCastText.x=this.m_DefaultText_X;  
               m_rect.height = m_BroadCastText.height;  
               // this.height=m_rect.height;  
               m_BroadCastText.scrollRect = m_rect;  
           }  
        }  
       
       
     /**************************广播信息处理事件*********************************/  
       
     /**鼠标经过处理事件*/  
         protected function rollOverHandler(event:MouseEvent):void  
        {  
             if(this.m_timer!=null&&this.broadcastText!="")  
             {  
                 this.m_timer.stop();  
             }  
        }  
          
        /**鼠标离开处理事件*/  
        protected function rollOutHandler(event:MouseEvent):void  
        {  
          if(this.m_timer!=null&&this.broadcastText!="")  
             {  
                 this.m_timer.start();  
             }  
        }  
          
       
      /**************************广播信息属性*************************************/  
       
     /**移动时间间隔*/  
         public function set BroadCastDeplay(value:Number):void  
          {  
             this.m_timer.delay=value;           
          }  
       
     /**设置广播信息内容*/  
          public function set BroadCastText(value:String):void  
         {  
             this.m_BroadCastText.text=value;  
             ScrollBroadText();  
         }  
       
     /**取得广播信息内容*/  
         public function get BroadCastText():String  
         {  
             return this.broadcastText;  
         }  
       
       
     /**广播信息宽度宽度*/  
         public override function get width():Number  
         {  
             return this.m_Width;  
         }  
       
        public override function set width(width:Number):void  
        {  
              this.m_Width=width;  
             this.m_rect.width=this.m_Width;  
            this.m_BroadCastText.scrollRect=this.m_rect;  
            ScrollBroadText();  
          //  this.m_BroadCastText.setTextFormat  
        }  
       
       
         /**设置滚动方向('left' or 'right')*/  
         public function set Direction(value:String):void  
          {  
              this.ScrollDirection=value;  
             ScrollBroadText();  
         }  
       
       
         /**设置字体格式化样式*/  
         public function set defaultTextFormat(format:TextFormat):void  
         {  
             this.m_BroadCastText.defaultTextFormat=format;  
             this.setTextFormat(format);  
         //  
         }  
       
         public function setTextFormat(format:TextFormat, beginIndex:int = -1, endIndex:int = -1):void  
        {  
            m_BroadCastText.setTextFormat(format, beginIndex, endIndex);  
            ScrollBroadText();  
        }  
       
        
         /**字体大小*/  
         public function set fontSize(value:Object):void  
         {  
             this.m_TextFormat=new TextFormat(this.m_TextFormat.font,value,this.m_TextFormat.color);  
             this.m_BroadCastText.setTextFormat(this.m_TextFormat,-1,-1);  
            
         }  
       
         /**字体名称*/  
         public function set fontFamily(value:String):void  
         {  
             this.m_TextFormat=new TextFormat(value,this.m_TextFormat.size,this.m_TextFormat.color);  
            this.m_BroadCastText.setTextFormat(this.m_TextFormat,-1,-1);  
         }  
       
         /**字体颜色*/  
         public function set color(value:Object):void  
         {  
             this.m_TextFormat=new TextFormat(this.m_TextFormat.font,this.m_TextFormat.size,value);  
             this.m_BroadCastText.setTextFormat(this.m_TextFormat,-1,-1);  
         }  
       
         /**是否是粗体*/  
         public function set fontWeight(value:Object):void  
         {  
             this.m_TextFormat=new TextFormat(this.m_TextFormat.font,this.m_TextFormat.size,this.m_TextFormat.color,value)  
             this.m_BroadCastText.setTextFormat(this.m_TextFormat,-1,-1);  
         }  
    }   
}

TestBroadCastMarquee.mxml :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  layout="absolute" creationComplete="init()" xmlns:marquee="marquee.*">
    <marquee:BroadCastMarquee width="500" height="25" BroadCastDeplay="800" BroadCastText="公告:火爆商品等你拿!" ScrollDirection="left">        
    </marquee:BroadCastMarquee>    
</mx:Application>

 --------------------------------------------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>   
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"   
        layout="vertical"   
        verticalAlign="middle"   
        backgroundColor="white">   
    
    <mx:Script>   
        <![CDATA[   
            private function fade_click():void {   
                fader.stop();   
                fader.play([box]);   
            }   
    
            private function wipe_click():void {   
                wiper.stop();   
                wiper.play([box]);   
            }   
        ]]>   
    </mx:Script>   
    
    <mx:Sequence id="fader">   
        <mx:Fade alphaFrom="0.0" alphaTo="1.0" />   
        <mx:Pause duration="{slider.value}" />   
        <mx:Fade alphaFrom="1.0" alphaTo="0.0" />   
    </mx:Sequence>   
    
    <mx:Sequence id="wiper">   
        <mx:SetPropertyAction name="alpha" value="1.0" />   
        <mx:WipeRight showTarget="true" />   
        <mx:Pause duration="{slider.value}" />   
        <mx:WipeRight showTarget="false" />   
        <mx:SetPropertyAction name="alpha" value="0.0" />   
    </mx:Sequence>   
    
    <mx:ApplicationControlBar dock="true">   
        <mx:Button label="fade box"   
                click="fade_click();" />   
        <mx:Button label="wipe box"   
                click="wipe_click();" />   
    
        <mx:Spacer width="100%" />   
    
        <mx:Label text="effect pause ({slider.value} ms):" />   
        <mx:HSlider id="slider"   
                minimum="1000"   
                maximum="3000"   
                value="1500"   
                labels="[1000,2000,3000]"   
                liveDragging="true"   
                showTrackHighlight="true"   
                snapInterval="100"   
                tickInterval="500"   
                dataTipPrecision="0" />   
    </mx:ApplicationControlBar>   
    
    <mx:Box id="box"   
            width="100%"   
            height="100%"   
            backgroundColor="haloSilver"   
            alpha="0.0" />   
    
</mx:Application>  

 

posted @ 2013-11-08 09:39  牧之丨  阅读(1548)  评论(0编辑  收藏  举报