Actionscript 3 如何防止flex中与addChild相关的闪烁?
在下面的应用程序中,我在运行时动态加载标签,并且需要它们每X秒更新一次(示例中为3)。在非常缓慢的internet连接上进行更新时,删除子项然后重新添加子项,防止闪烁的最佳方法是什么?我希望这是无缝的Actionscript 3 如何防止flex中与addChild相关的闪烁?,actionscript-3,apache-flex,flex3,Actionscript 3,Apache Flex,Flex3,在下面的应用程序中,我在运行时动态加载标签,并且需要它们每X秒更新一次(示例中为3)。在非常缓慢的internet连接上进行更新时,删除子项然后重新添加子项,防止闪烁的最佳方法是什么?我希望这是无缝的 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%"
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
width="100%" height="100%"
creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.containers.HBox;
import mx.controls.Button;
import mx.controls.Label;
private var timer:Timer;
protected function init():void
{
updateContainer();
timer = new Timer(3000);
timer.addEventListener(TimerEvent.TIMER, updateContainer);
timer.start();
}
private function updateContainer(evt:TimerEvent = null):void
{
trace("update");
container.removeAllChildren();
for(var i:int = 0; i < 50; i++){
var myHBox:HBox = new HBox();
myHBox.percentWidth = 100;
myHBox.setStyle("backgroundColor", "#FFFFFF");
var myLabel:Label = new Label();
myLabel.text = "Hello World " + i;
myHBox.addChild(myLabel);
container.addChild(myHBox);
}
}
]]>
</mx:Script>
<mx:VBox id="container" />
</mx:Application>
您的问题是,不能保证您可以在一次更新中执行操作(“删除所有元素”和“添加新的子项”)。事实上,完全可以肯定的是,它们至少会在两次更新中发生——一次用于删除,一次用于添加。闪烁是由两次更新之间的短暂时间间隔引起的 最简单的修复方法是重用已经创建的组件,而不是在每次计时器更新时费力地创建50个带有标签的容器。通过更多的努力,您可以动态地创建和删除新组件,或者使用绑定 下面是通过组件重用对代码的快速修改。您不会在这里体验到闪烁,因为标签只在一次更新中更改
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.containers.HBox;
import mx.controls.Button;
import mx.controls.Label;
private var timer:Timer;
private var labels:Array = [];
protected function init():void
{
updateContainer();
timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER, updateContainer);
timer.start();
initContainers();
}
private function initContainers():void
{
labels = [];
for (var i:int = 0; i < 50; i++)
{
var myHBox:HBox = new HBox();
myHBox.percentWidth = 100;
myHBox.setStyle("backgroundColor", "#FFFFFF");
var myLabel:Label = new Label();
myHBox.addChild(myLabel);
container.addChild(myHBox);
labels.push(myLabel);
}
}
private function updateContainer(evt:TimerEvent = null):void
{
trace("update");
for(var i:int = 0; i < 50; i++)
{
if (labels[i] != null)
{
(labels[i] as Label).text = "Hello World " + i + " " + (new Date).time;
}
}
}
]]>
</fx:Script>
<mx:VBox id="container" />
您的问题是,不能保证您可以在一次更新中执行操作(“删除所有元素”和“添加新子项”)。事实上,完全可以肯定的是,它们至少会在两次更新中发生——一次用于删除,一次用于添加。闪烁是由两次更新之间的短暂时间间隔引起的 最简单的修复方法是重用已经创建的组件,而不是在每次计时器更新时费力地创建50个带有标签的容器。通过更多的努力,您可以动态地创建和删除新组件,或者使用绑定 下面是通过组件重用对代码的快速修改。您不会在这里体验到闪烁,因为标签只在一次更新中更改
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.containers.HBox;
import mx.controls.Button;
import mx.controls.Label;
private var timer:Timer;
private var labels:Array = [];
protected function init():void
{
updateContainer();
timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER, updateContainer);
timer.start();
initContainers();
}
private function initContainers():void
{
labels = [];
for (var i:int = 0; i < 50; i++)
{
var myHBox:HBox = new HBox();
myHBox.percentWidth = 100;
myHBox.setStyle("backgroundColor", "#FFFFFF");
var myLabel:Label = new Label();
myHBox.addChild(myLabel);
container.addChild(myHBox);
labels.push(myLabel);
}
}
private function updateContainer(evt:TimerEvent = null):void
{
trace("update");
for(var i:int = 0; i < 50; i++)
{
if (labels[i] != null)
{
(labels[i] as Label).text = "Hello World " + i + " " + (new Date).time;
}
}
}
]]>
</fx:Script>
<mx:VBox id="container" />
请注意,我已尝试将它们封装在另一个容器中,然后尝试将整个容器作为一个整体添加,而不是单独添加。请注意,我已尝试将它们封装在另一个容器中,然后尝试将整个容器作为一个整体添加,而不是单独添加。谢谢,这就是我最终选择的。谢谢,这就是我最终选择的。