Flash addChild()-DisplayObject不是';我看不见
当我将DisplayObject添加到函数中的DisplayObjectContainer(例如,将精灵添加到精灵)时,DisplayObject似乎不是立即添加的,而是在完成函数后添加的 请参见此示例:Flash addChild()-DisplayObject不是';我看不见,flash,actionscript-3,flex4,Flash,Actionscript 3,Flex4,当我将DisplayObject添加到函数中的DisplayObjectContainer(例如,将精灵添加到精灵)时,DisplayObject似乎不是立即添加的,而是在完成函数后添加的 请参见此示例: package { import flash.display.Sprite; import flash.events.MouseEvent; public class AddChildTest extends Sprite { private var
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class AddChildTest extends Sprite {
private var _sprite:Sprite;
public function AddChildTest():void{
var button:Sprite = new Sprite();
button.graphics.beginFill(0x00ff00);
button.graphics.drawRect(0, 0, 50, 50);
button.graphics.endFill();
button.buttonMode = true;
button.addEventListener(MouseEvent.CLICK, onClick);
addChild(button);
}
private function onClick(event:MouseEvent):void {
_sprite = new Sprite();
_sprite.graphics.beginFill(0xff0000);
_sprite.graphics.drawRect(0, 0, 50, 50);
_sprite.graphics.endFill();
_sprite.x = 50;
_sprite.y = 50;
//this red sprite is not visible immediateley!
addChild(_sprite);
//put something time-consuming here
for (var i:int = 0; i < 2000; i++){
trace(i);
}
}
}
}
包{
导入flash.display.Sprite;
导入flash.events.MouseEvent;
公共类AddChildTest扩展了Sprite{
私有变量精灵:精灵;
公共函数AddChildTest():void{
var按钮:Sprite=newsprite();
按钮.graphics.beginll(0x00ff00);
按钮.graphics.drawRect(0,0,50,50);
button.graphics.endFill();
button.buttonMode=true;
按钮.addEventListener(MouseEvent.CLICK,onClick);
addChild(按钮);
}
私有函数onClick(事件:MouseEvent):void{
_精灵=新精灵();
_sprite.graphics.beginll(0xff0000);
_sprite.graphics.drawRect(0,0,50,50);
_sprite.graphics.endFill();
_雪碧x=50;
_雪碧y=50;
//这个红色的精灵是看不见的!
addChild(_sprite);
//把一些耗时的东西放在这里
对于(变量i:int=0;i<2000;i++){
微量元素(i);
}
}
}
}
所以我们有一个简单的绿色按钮,当它被点击时,有一个红色的精灵被构建并添加到舞台上。
但实际上,在onClick()函数完全执行之前,红色精灵是不可见的
为什么会这样?我该怎么做才能让红色精灵立即可见
是否有一些(对于开发人员来说是不可见的)全局paint()或update()函数,在某个堆栈完全执行或其他操作之前不会执行
是否有一些(对于不可见的开发人员)全局绘制()或更新()
函数,直到某个堆栈完全执行或
什么
是的,有些东西。这里有一个随机链接(通过谷歌):
直到执行所有帧代码后,才会绘制或重新绘制屏幕。前面的答案与帧构造有关,同时请注意,有几个有用的事件可帮助您处理添加/删除对象时显示列表的延迟:
private function onClick(event:MouseEvent):void {
_sprite = new Sprite();
_sprite.graphics.beginFill(0xff0000);
_sprite.graphics.drawRect(0, 0, 50, 50);
_sprite.graphics.endFill();
_sprite.x = 50;
_sprite.y = 50;
//this red sprite is not visible immediateley!
_sprite.addEventListener(Event.ADDED_TO_STAGE, onReady);
addChild(_sprite);
}
private function onReady(e: Event): void {
_sprite.removeEventListener(Event.ADDED_TO_STAGE, onReady);
//put something time-consuming here
for (var i:int = 0; i < 2000; i++){
trace(i);
}
}
private函数onClick(事件:MouseEvent):void{
_精灵=新精灵();
_sprite.graphics.beginll(0xff0000);
_sprite.graphics.drawRect(0,0,50,50);
_sprite.graphics.endFill();
_雪碧x=50;
_雪碧y=50;
//这个红色的精灵是看不见的!
_sprite.addEventListener(Event.ADDED_至_阶段,onReady);
addChild(_sprite);
}
私有函数onReady(e:事件):void{
_sprite.removeEventListener(Event.ADDED_到_阶段,onReady);
//把一些耗时的东西放在这里
对于(变量i:int=0;i<2000;i++){
微量元素(i);
}
}
这里,在启动耗时的例程之前,会监听Event.ADDED_TO_STAGE,因此屏幕不会留空 这与Flash的单线程特性有关,而不是其他任何特性。它的工作方式是执行响应交互事件的任何代码(您的代码)。然后,响应prerender事件的任何代码(没有使用那么多),完成所有操作后,最终呈现 这是一连串的事件 如果代码需要很长时间才能运行,这将延迟后续渲染 因此,如果你想显示一个进度指示器或类似的东西,你至少需要在“轨迹”上等待下一次处理,最好在多个帧上分割,以保持你的UI美观和响应。最简单的方法是使用定时器稍微延迟计算
private function onClick(event:MouseEvent):void {
// add sprite here
var t:Timer = new Timer(50, 1);
// i'm using an anonymous function here, however, a proper event handler
// function is probably cleaner
t.addEventListener(TimerEvent.COMPLETE, function(e:Event):void {
//put something time-consuming here
for (var i:int = 0; i < 2000; i++){
trace(i);
}
}
t.start();
}
private函数onClick(事件:MouseEvent):void{
//在这里加雪碧
变量t:定时器=新定时器(50,1);
//然而,我在这里使用的是一个匿名函数,一个合适的事件处理程序
//功能可能更干净
t、 addEventListener(TimerEvent.COMPLETE,函数(e:事件):无效{
//把一些耗时的东西放在这里
对于(变量i:int=0;i<2000;i++){
微量元素(i);
}
}
t、 start();
}
原因如下:
flash player以帧方式呈现显示列表。它发送事件。输入_frame
,准备呈现(在MovieClips中移动播放头等),然后事件。呈现
(假设您使舞台无效),然后渲染,然后分派事件。离开后退出\u帧
因此,在渲染下一帧之前,对显示列表的任何后续更改将不可见-除非强制执行
然而,在退出帧和下一个进入帧之间,来自I/O和定时器的所有事件都被调度。鼠标也在输入设备中,因此此时处理MouseEvent
s
有些事件(并非全部,但最重要的事件包括MouseEvent
、TimerEvent
和KeyboardEvent
)具有updateAfterEvent
方法,该方法将强制flash播放器在事件处理后立即渲染
请注意,此选项应小心处理。如果您的帧速率下降到目前为止,您会看到正在处理的鼠标事件和正在渲染的更改之间的延迟,强制在播放器上进行更多渲染可能不是最好的主意。感谢您的快速回复,但是……好吧,我来自Java,对frame-t不太了解我正在开发一个纯AS3应用程序。看来我需要深入了解一下闪光灯的原理…我