Flex实现在ViewStack中的滚动新闻实时刷新(下)!

来源:互联网 发布:php从入门到精通怎么样 编辑:程序博客网 时间:2024/06/04 17:47

      第一、为了解决在滚动过程中刷新数据的问题,发现了Move组件的tweenEnd事件(当补间效果结束时分派),只要在此事件中完成数据刷新动作,即可满足要求,修改代码如下:

 

 <!-- 脚本-->
  <mx:Script>
      <![CDATA[

 

 //监听 Move 结束动作 判定是否需要更新   
          internal function listener2Refresh(event:TweenEvent):void {
    
    var myEvent:MyTweenRefreshEvent2 = new MyTweenRefreshEvent2(this.refreshData,MyTweenRefreshEvent2.TWEEN_REFRESH_EVENT);        //自定义事件 其作用将在之后讲解
    
    if(this.refreshData==true){
     
     TMService.send();       //HttpServie完成前后端数据的交互
     
     myEvent.doRefresh=true;
     
   //  Alert.show("Refresh After Scroll End!");
    }
    else{
     
     myEvent.doRefresh=false;
     
   //  Alert.show("No Refresh!");
    }
    
    this.dispatchEvent(myEvent); //自定义事件加到事件流
      }
     
     
      
      ]]>
     </mx:Script>
   
    <mx:Move id="move_up" target="{AbfltDG}" tweenEnd="listener2Refresh(event)"/>

 

     

     第二、把本新闻滚动效果页,作为自定义控件放入到ViewStack组件中,如何才能触发新闻滚动控件中滚动结束的事件呢?

     答案就是完成一个自定义事件!

 

     1.自定义事件之MyTweenRefreshEvent.as

    

     public class MyTweenRefreshEvent extends Event
 {
  
  public var doRefresh:Boolean=false;
  
  public static const TWEEN_REFRESH_EVENT:String="TweenRefreshEvent"; //使用常量定义事件的触发方式名称
    
  public function MyTweenRefreshEvent(doRefresh:Boolean,type:String)
  {
   super(type, false, false);
   
   this.doRefresh=doRefresh;
  }
 }

 

     2.在自定义组件中封装该事件

 

      <!--自定义事件-->
 <mx:Metadata>
  //声明事件注册通道的方法。name是事件对应的名称,也就是type。name一定要和事件类中的名称一致
     [Event(name="TweenRefreshEvent", type="sim.monitor.asobj.MyTweenRefreshEvent2")]
 </mx:Metadata>

  

 

     3.之后就是在Move的tweenEnd中 分派自定义事件了,见“第一”中的代码

 

     4.最后就是在ViewStack中的自定义控件中调用自定义事件了。

 

      <!--页面组件-->

        <mx:ViewStack x="0" y="0" id="myVS" horizontalCenter="0" width="1024" height="768" creationCompleteEffect="{myWR}">
  <ns1:SimMonitorFirstLevel1 hideEffect="{myWD}" showEffect="{myWU}" id="partA">   
  </ns1:SimMonitorFirstLevel1>
        <ns1:SimMonitorFirstLevel2 hideEffect="{myWD}" showEffect="{myWU}" id="partB" TweenRefreshEvent="partBRefreshData(event)">
  </ns1:SimMonitorFirstLevel2>
 </mx:ViewStack>

 

 

 <!--脚本-->

 <mx:Script>
     <![CDATA[
          import flash.events.KeyboardEvent;
         
          import sim.monitor.asobj.MyTweenRefreshEvent2;
         
          private var timer:Timer;  //定时器
         
          private var partAinterval:Number=5;   //页面A刷新间隔 5分钟
         
          private var partBinterval:Number=3;   //页面B刷新间隔 3分钟
          
          private var partAElapsed:Number=0;  //页面A逝去时间
         
          private var partBElapsed:Number=0;  //页面B逝去时间
      
            
      //定时器操作
      private function onTimer(evt:TimerEvent):void {
              
                 partAElapsed++;
                 partBElapsed++;
                 
                 if(myVS.selectedIndex==0&&partAElapsed>=partAinterval){  //当前显示页为A 且刷新时间大于A页设置间隔
                  
                     partA.serviceCall();  
                     partAElapsed=0;    //刷新数据后复位
                 }
                
                 if(myVS.selectedIndex==1&&partBElapsed>=partBinterval){  //当前显示页为B 且刷新时间大于B页设置间隔                  
                      
                         partB.refreshData=true;
                   //    partBElapsed=0; //刷新数据后复位
                 }
                
                              
            }
           
           
            //PartB DataGrid滚动结束后 刷新数据
            private function partBRefreshData(event:MyTweenRefreshEvent2):void{             
             
              if(event.doRefresh==true){
               
                partB.refreshData=false;
                 
                  partBElapsed=0; //刷新数据后复位
              }
             
             
             
            }            
                  
     ]]>
     
    </mx:Script>

 

      这样就可以结合ViewStack的显示,来优化是否刷新当前滚动新闻页的数据了。

 

      PS:本例中完成后,自定义事件的调用顺序是先调用自定义控件的listener2Refresh方法,之后再回到外部调用的partBRefreshData函数中!切记此事件执行顺序!

原创粉丝点击