Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何防止flex中与addChild相关的闪烁?_Actionscript 3_Apache Flex_Flex3 - Fatal编程技术网

Actionscript 3 如何防止flex中与addChild相关的闪烁?

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%"

在下面的应用程序中,我在运行时动态加载标签,并且需要它们每X秒更新一次(示例中为3)。在非常缓慢的internet连接上进行更新时,删除子项然后重新添加子项,防止闪烁的最佳方法是什么?我希望这是无缝的

<?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" />


请注意,我已尝试将它们封装在另一个容器中,然后尝试将整个容器作为一个整体添加,而不是单独添加。请注意,我已尝试将它们封装在另一个容器中,然后尝试将整个容器作为一个整体添加,而不是单独添加。谢谢,这就是我最终选择的。谢谢,这就是我最终选择的。