Безумное поведение Graphics.lineStyle - PullRequest
0 голосов
/ 22 мая 2010

Мне нужна помощь с небольшим моим проектом.

Справочная информация: у меня есть небольшая иерархия производных классов Sprite (5 уровней, начиная с того, который является корневым классом приложения в Flex Builder). Свойства Width и Height переопределяются, так что мой класс всегда запоминает его запрошенный размер (не только ограничивающий размер вокруг содержимого), а также эти свойства явно устанавливают значения scaleX и scaleY равными 1, так что масштабирование никогда не будет задействовано. После сохранения этих значений вызывается метод draw () для перерисовки содержимого.

График: Рисование очень прямолинейно. Только самый глубокий объект (на уровне 1 с 1 индексом) рисует что-то в объекте this.graphics, например так:

var gr:Graphics = this.graphics;
gr.clear();

gr.lineStyle(0, this.borderColor, 1, true, LineScaleMode.NONE);
gr.beginFill(0x0000CC);
gr.drawRoundRectComplex(0, 0, this.width, this.height, 10, 10, 0, 0);
gr.endFill();

Далее: Также есть событие MouseEvent.MOUSE_WHEEL, прикрепленное к родителю объекта, который рисует. Обработчик просто изменяет размер этого объекта рисования.

Проблема: Скриншот

При изменении размера иногда эта линия границы волос с помощью LineScaleMode.NONE набирает толщину (довольно часто даже> 10 пикселей) + она довольно часто оставляет свой след (как видно на рисунке выше и ниже синей рамки (обратите внимание на эту рамку) имеет одну пиксельную черную рамку)). Когда я устанавливаю толщину lineStile в NaN или альфа в 0, этот след больше не происходит.

Я возвращаюсь к этой проблеме и оставляю ее для некоторых других вещей уже более недели.

Есть идеи у кого-нибудь?

P.S. Серый фон - это сам Flash Player, а не мой выбор ..: D

По запросу, немного больше: Предполагается, что приложение представляет собой календарь-график с «масштабирующей» функцией (проект для курса в университете). Таким образом, у меня есть эти функции, которые имеют отношение к изменению размера:

        public function performZoom():void
        {
            // Calculate new width:
            var newDayWidth:Number = view.width / 7 * this.calModel.zoom;
            if (newDayWidth < 1)
            {
                newDayWidth = 1;
            }
            var newWidth:int = int(newDayWidth * timeline.totalDays);

            // Calculate day element Height/Width ratio:
            var headerHeight:Number = this.timeline.headerAllDay;
            var proportion:Number = 0;
            if (this.view.width != 0 && this.view.height != 0)
            {
                proportion = 1 / (this.view.width / 7) * (this.view.height - this.timeline.headerAllDay); 
            }

            // Calculate new height:
            var newHeight:int = int(newDayWidth * proportion + this.timeline.headerAllDay);

            // Calculate mouse position scale on X axis:
            var xScale:Number = 0;
            if (this.timeline.width != 0)
            {
                xScale = newWidth / this.timeline.width; 
            }

            // Calculate mouse position scale on Y axis:
            var yScale:Number = 0;
            if (this.timeline.height - this.timeline.headerAllDay != 0)
            {
                yScale = (newHeight - this.timeline.headerAllDay) / (this.timeline.height - this.timeline.headerAllDay);
            }

            this.timeline.beginUpdate();

            // Resize the timeline
            this.timeline.resizeElement(newWidth, newHeight);
            this.timeline.endUpdate();

            // Move timeline:
            this.centerElement(xScale, yScale);

            // Reset timeline local mouse position:
            this.centerMouse();
        }

        public function resizeElement(widthValue:Number, heightValue:Number):void
        {
            var prevWidth:Number = this.myWidth;
            var prevHeight:Number = this.myHeight;

            if (widthValue != prevWidth || heightValue != prevHeight)
            {
                super.width = widthValue;
                super.height = heightValue;
                this.scaleX = 1.0;
                this.scaleY = 1.0;

                this.myHeight = heightValue;
                this.myWidth = widthValue;

                if (!this.docking)
                {
                    this.origHeight = heightValue;
                    this.origWidth = widthValue;
                }

                this.updateAnchorMargins();

                onResizeInternal(prevWidth, prevHeight, widthValue, heightValue);
            }
        }

Да. Я знаю ... много ядра и много свойств, но на самом деле большинство вещей было отключено в конце, и ситуация такая, как описано вверху.

это не сработало:

gr.lineStyle(); // Reset line style

Ответы [ 2 ]

1 голос
/ 22 мая 2010

Можем ли мы увидеть ваш код изменения размера?

Также попробуйте очистить стиль линии и заливку:

gr.lineStyle(0, this.borderColor, 1, true, LineScaleMode.NONE);
gr.beginFill(0x0000CC);
gr.drawRoundRectComplex(0, 0, this.width, this.height, 10, 10, 0, 0);
gr.endFill();
gr.lineStyle();//<---- add this line
0 голосов
/ 22 мая 2010

Я не знаю, является ли это ошибкой во флэш-памяти или что это такое, но я наконец нашел решение.

Дело в том, что в моем случае при изменении размеров в двух словах вы получите вот так:

this.width = this.stage.stageWidth / 7 * 365;

Когда я переключаюсь в развернутое окно, this.width получает значение 86k +. Когда я добавил этот фрагмент кода, чтобы нарисовать горизонтальную линию, он исправился:

        var recWidth:Number = this.width;
        var i:int;
        var newEnd:Number = 0;
        for (i = 1; newEnd < recWidth; i++)
        {
            newEnd = 100 * i;
            if (newEnd > recWidth)
            {
                newEnd = recWidth;
            }
            gr.lineTo(newEnd, 0);
        }

Я не знаю, что происходит .. Это неудобно ...

...