第一、为了解决在滚动过程中刷新数据的问题,发现了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函数中!切记此事件执行顺序!