Пользовательский Flex / ActionScript UIComponent позволяет рисовать несколько раз во время изменения размера - PullRequest
0 голосов
/ 19 ноября 2010

Я создал пользовательский компонент, и всякий раз, когда размер браузера или его конкретного контейнера изменяется, происходит перерисовка, но содержимое компонента рисуется снова, снова и снова ... Итак, если я переместлю контейнер, яв итоге несколько кругов нарисованы друг над другом, но смещены в зависимости от того, где находится контейнер, когда происходит перекраска.Мой код 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);                             
            }

        }

1 Ответ

1 голос
/ 19 ноября 2010

Читайте о жизненном цикле Flex компонента .Многие вещи могут выполнять invalidateDisplayList (), вызывая повторное выполнение updateDisplayList во время следующего события рендеринга.

Проблема, которую я вижу здесь, заключается в том, что вы каждый раз создаете новые baseCircle, outerCircle и innerCircle.Скорее, вы должны создавать по одному для каждого экземпляра и обновлять его при запуске updateDisplayList ().

Я бы, вероятно, сделал ваши экземпляры переменных innerCircle, outerCircle и baseCircle для текущего компонента.В createChildren () вы можете добавить их как дочерние компоненты компонента.В updateDisplayList вы можете сделать соответствующий рисунок.

...