Apache flex 自定义Flex/ActionScript UIComponent在调整大小期间会多次绘制

Apache flex 自定义Flex/ActionScript UIComponent在调整大小期间会多次绘制,apache-flex,actionscript-3,actionscript,flex3,flex4,Apache Flex,Actionscript 3,Actionscript,Flex3,Flex4,我已经创建了一个自定义uicomponent,无论何时调整浏览器或其特定容器的大小,都会进行重新绘制,但该组件的内容会一次又一次地绘制。。。 因此,如果我移动容器,我将得到多个相互重叠的圆,但偏移取决于重新绘制时容器所在的位置。 下面是我的updateDisplayList代码。 我是否需要做一些清理,这样它就不会像这样不断地被复制??? 非常感谢你的帮助 override protected function updateDisplayList(unscaledWidth:Number

我已经创建了一个自定义uicomponent,无论何时调整浏览器或其特定容器的大小,都会进行重新绘制,但该组件的内容会一次又一次地绘制。。。 因此,如果我移动容器,我将得到多个相互重叠的圆,但偏移取决于重新绘制时容器所在的位置。 下面是我的updateDisplayList代码。 我是否需要做一些清理,这样它就不会像这样不断地被复制??? 非常感谢你的帮助

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {

            super.updateDisplayList(unscaledWidth, unscaledHeight);                             

            trace("height: " + parent.height);
            trace("width: " + parent.width);

            if (parent.height <= parent.width) {
                radius = Math.round((parent.height*.95)/2);
            }
            else {
                radius = Math.round((parent.width*.95)/2);
            }

            trace("radius: " + radius);

            outterRadius = Math.round(radius*.70);
            innerRadius = Math.round(radius*.30);

            trace("outterradius: " + outterRadius); 
            trace("innerradius: " + innerRadius);

            centerX = this.width/2;
            centerY = this.height/2;

            trace("centerX: " + centerX);
            trace("centerY: " + centerY);

            var innerCircle:Sprite = new Sprite();
            var outterCircle:Sprite = new Sprite();
            var baseCircle:Sprite = new Sprite();

            baseCircle.graphics.beginFill(0x000000);
            baseCircle.graphics.drawCircle(centerX, centerY, radius);               

            outterCircle.graphics.lineStyle(2, 0xA10303, .75);
            outterCircle.graphics.drawCircle(centerX, centerY, outterRadius);


            innerCircle.graphics.lineStyle(2, 0xA10303, .75);
            innerCircle.graphics.drawCircle(centerX, centerY, innerRadius);

            addChild(baseCircle);   
            addChild(outterCircle);
            addChild(innerCircle);

            for (var bubbleCount:int=0; bubbleCount < bubbleList.length; bubbleCount++) {
                var globalPoint:Point = this.localToGlobal(getPointInCircle(radius));
                var radarBubble:RadarBubble = bubbleList.getItemAt(bubbleCount) as RadarBubble;
                var bubbleLocalPoint:Point = radarBubble.globalToLocal(globalPoint);
                radarBubble.x = bubbleLocalPoint.x;
                radarBubble.y = bubbleLocalPoint.y;
                trace("Add bubble: " + radarBubble.x + ", " + radarBubble.y + ", " + radarBubble.radius);
                addChild(radarBubble);                                      
            }                           

            // create radar display lines to be animated
            for (var angleCount:int=0; angleCount < 360; angleCount++) {
                var tmpLine3:Sprite = new Sprite();
                tmpLine3.graphics.lineStyle(2, 0xA10303, 1);
                tmpLine3.graphics.moveTo(centerX, centerY);                                         
                tmpLine3.graphics.lineTo(getEndpoint(angleCount).x, getEndpoint(angleCount).y);
                tmpLine3.visible = false;
                addChild(tmpLine3);
                lineCollection.addItemAt(tmpLine3, angleCount);                             
            }

        }
覆盖受保护的函数updateDisplayList(unscaledWidth:Number,unscaledHeight:Number):无效{
super.updateDisplayList(unscaledWidth、unscaledHeight);
跟踪(“高度:+父级高度”);
跟踪(“宽度:“+父级宽度”);
如果(parent.height在上读取。很多事情可能会执行invalidateDisplayList(),从而导致在下一个渲染事件期间重新执行updateDisplayList

我在这里看到的问题是,您每次都在创建新的baseCircle、outerCircle和innerCircle。相反,您应该创建每个实例中的一个,并在updateDisplayList()运行时更新它


我可能会在当前组件上创建innerCircle、outerCircle和baseCircle变量的实例。在createChildren()中,您可以将它们作为子对象添加到组件上。在updateDisplayList中,您可以进行相关绘图。

谢谢大家-我将进一步了解这一点,以便更好地理解updateDisplayList()还有createChildren()。我会让你们知道我是怎么做的。我甚至不认为我需要圆是孩子,我可以在updateDisplayList()中绘制它们。但是,我要添加的其他孩子需要是单独的精灵…Flextras和Wade-当我添加需要在createChildren()中使用addChild()设置动画的线条时,这些线永远不会显示。最初它们被设置为visible=false b/c我有一个计时器,一次只显示一行来设置线的动画。有什么想法吗?覆盖受保护的函数createChildren():void{super.createChildren();//创建要为其设置动画的雷达显示线(var-angleCount:int=0;angleCount<360;angleCount++){var-tmpLine3:Sprite=new-Sprite();tmpLine3.graphics.lineStyle(2,0xA10303,1);tmpLine3.graphics.moveTo(centerX,centerY);tmpLine3.graphics.lineTo(getEndpoint(angleCount.x,getEndpoint(angleCount.y);tmpLine3.visible=false;addChild(tmpLine3);lineCollection.addItemAt(tmpLine3,angleCount);}忽略最后一个代码片段。我理解为什么我看不到孩子们,这是因为我的孩子们的线条是用零作为起点和终点绘制的。也许更容易解释我试图做什么,看看你们是否有任何建议。我希望updateDisplayList绘制这个目标/雷达样的背景,这很有效e、 但是,我需要动态地向该组件添加和删除其他子组件,并且我似乎看不到添加到此组件的任何子组件,除非我在updateDisplayList中执行此操作。当移动到重用DisplayObjects时,不要忘了调用
graphics.clear()
在重画周期中,为任何要完全重画的DisplayObject重画。如果不调用
clear()
您只需在当前图形显示中添加行/填充,