键盘、鼠标、定时器的事件的方法updateAfterEvent会让Flashplayer立即更新屏幕,但是不会发生Event.RENDER事件。
stage.invalidate()不会让Flashplayer立即更新屏幕,但是会促使Flashplayer发出Event.RENDER事件。
updateAfterEvent和stage.invalidate的结合会让促使Flashplayer发出Event.RENDER事件,同时立即更新屏幕。
*下面实验结果验证了这些事实的同时还说明了一些事情:
1. 定时器并非如设想的那样等时间间隔发生。
2.updateAfterEvent不会促使所在帧提前结束,也就是说它对帧频没有影响(这个结果证明了网间说法是错误的)。
下例中,在onTime函数中,注释掉了stage.invalidate()。你会发现onRender函数没有被触发。
也就是说尽管updateAfterEvent使得立即更新屏幕,但是RENDER事件没有发生。如果在onRender函数中定义了内容,该内容被忽略。
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class testAS extends Sprite {
private var startW:int = 10;
private var time:Timer = new Timer(300);
public function testAS() {
//设置帧频为1秒1帧
this.stage.frameRate = 1;
//监听ENTER_FRAME和RENDER事件
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
this.addEventListener(Event.RENDER,onRender);
//设定定时器,时间间隔小于1秒
time.addEventListener(TimerEvent.TIMER, onTime);
time.start();
}
public function onEnterFrame(e:Event):void
{
//记录时刻
var now:Date = new Date();
trace("onEnterFrame=" + now.seconds + " " + now.milliseconds);
}
public function onRender(e:Event):void
{
//记录时刻
var now:Date = new Date();
trace("onRender=" + now.seconds + " " + now.milliseconds + "\n");
}
public function onTime(e:TimerEvent):void
{
//记录时刻
var now:Date = new Date();
trace("onTime=" + now.seconds + " " + now.milliseconds + "\n");
//为了触发Event.RENDER事件,而修改画面外观
this.graphics.clear();
this.graphics.lineStyle(1,0x998877);
this.graphics.drawRect(10,10,startW,20);
//this.stage.invalidate();
startW += 5;
e.updateAfterEvent();
}
}
}
结果:
[SWF] C:\Users\Administrator\Adobe Flash Builder 4.6\testAS\bin-debug\testAS.swf - 解压缩后为 1,875 个字节
onTime=45 64
onTime=45 140
onEnterFrame=45 489 //证明了帧频的确为1
onTime=45 673
onTime=46 207 //证明了尽管调用了event.updateAfterEvent(),并且从屏幕上看到了预期的变化,但是onRender函数并没有执行(RENDER事件没有发生)
onEnterFrame=46 474
onTime=46 740
onTime=47 273
onEnterFrame=47 476
onTime=47 807
onTime=48 410
onEnterFrame=48 476
onTime=48 874
onTime=49 407
onEnterFrame=49 474
onTime=49 940 //证明了定时器并非等时间间隔触发
onEnterFrame=50 476
onTime=50 477
onTime=51 6
再释放stage.invalidate()。重新执行,你会发现onRender函数被触发。
[SWF] C:\Users\Administrator\Adobe Flash Builder 4.6\testAS\bin-debug\testAS.swf - 解压缩后为 1,898 个字节 onTime=14 257 onRender=14 261 onTime=14 472 onRender=14 474 onEnterFrame=14 678 //证明了帧频仍然为1,并没有受到stage.invalidate()、event.updateAfterEvent()的影响。 onTime=15 5 onRender=15 7 //证明了stage.invalidate()、event.updateAfterEvent()的共同作用下,onRender函数被执行了(RENDER事件发生了)。
onTime=15 539onRender=15 540onEnterFrame=15 689onTime=16 73onRender=16 75onTime=16 606onRender=16 607onEnterFrame=16 683onTime=17 139onRender=17 140onEnterFrame=17 674onTime=17 675onRender=17 677onTime=18 206onRender=18 208onEnterFrame=18 675onTime=18 739onRender=18 741//且RENDER事件的发生并没有使该帧提前结束。