ActionScript - очистка графики с помощью JointStyle.MITER - PullRequest
1 голос
/ 09 ноября 2010

Я столкнулся с нежелательным эффектом использования JointStyle.MITER при очистке / перерисовке графики.

Мой проект предусматривает управление пользовательской линейной графикой с закругленными и острыми краями, поэтому я бы хотел использовать стиль соединения под углом.

Когда толщина линии значительно увеличивается, стиль митры влияет даже на круглые области линии. Хотя я нахожу это неудачным, это понятно, а не ошибка, о которой я говорю. ошибка (?) возникает, когда уменьшение толщины линии не полностью очищает графику, как указано в коде при каждом изменении толщины, оставляя артефакты линейной графики там, где раньше была линия. Артефакты также оставлены острыми краями, а не просто закругленными углами.

Я использую Flash Player версии 10.1.53.64 в Mac OS X Snow Leopard (10.6.4).

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

Обновление: Графические артефакты поверхностны. Перетаскивание фигуры по их местоположению после их появления удалит их. Код обновлен с возможностью перетаскивания.

package
{
import flash.display.CapsStyle;
import flash.display.JointStyle;
import flash.display.LineScaleMode;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;

public class StrokeWidth extends Sprite
    {
    private var roundRect:Sprite = new Sprite();
    private var strokeThickness:Number = 6;

    public function StrokeWidth()
        {
        addEventListener(Event.ADDED_TO_STAGE, init);
        }

    private function init(evt:Event):void
        {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEventListener);
        roundRect.addEventListener(MouseEvent.MOUSE_DOWN, mouseEventListener);
        roundRect.addEventListener(MouseEvent.MOUSE_UP, mouseEventListener);

        drawRoundRect();
        roundRect.x = roundRect.y = 100;
        addChild(roundRect);
        }

    private function drawRoundRect():void
        {
        roundRect.graphics.clear();
        roundRect.graphics.lineStyle(strokeThickness, 0x000000, 1.0, true, LineScaleMode.NONE, CapsStyle.NONE, JointStyle.MITER);
        roundRect.graphics.beginFill(0xFF0000);
        roundRect.graphics.drawRoundRect(0, 0, 400, 200, 100);
        }

    private function mouseEventListener(evt:MouseEvent):void
        {
        switch  (evt.type)
                {
                case MouseEvent.MOUSE_DOWN: roundRect.startDrag();  break;
                case MouseEvent.MOUSE_UP:   roundRect.stopDrag();   
                }
        }

    private function keyDownEventListener(evt:KeyboardEvent):void
        {
        switch  (evt.keyCode)
                {
                case Keyboard.LEFT:     strokeThickness -= 1;       break;
                case Keyboard.RIGHT:    strokeThickness += 1;
                }

        drawRoundRect();
        }
    }
}

alt text

Ответы [ 2 ]

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

интересно. проблема была вызвана тем, что режим масштабирования lineStyle был установлен равным none:

LineScaleMode.NONE

изменение его на нормальное устраняет проблему:

LineScaleMode.NORMAL
0 голосов
/ 09 ноября 2010

как насчет воссоздания фигуры?

...