Это «нормально», как работает жизненный цикл компонента во Flex. Когда в вашу функцию вызывается invalidateDisplayList
, он перерисовывает все внутри нее и очищает graphics
. При добавлении этого ярлыка он становится недействительным.
На вашем месте я бы сделал что-то вроде этого:
public class MyComponent extends Group
{
protected var _previousX:int;
protected var _previousY:int;
protected var _drawing:UIComponent;
public function MyComponent()
{
super();
this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
this.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
public function addLabel():void
{
var label:Label = new Label();
label.x = 100;
label.y = 100;
label.text = "new label ";
addElement(label);
}
override protected function createChildren():void
{
super.createChildren();
if(!this._drawing)
{
this._drawing = new UIComponent();
this._drawing.percentWidth = 100;
this._drawing.percentHeight = 100;
this.addElement(this._drawing);
}
}
protected function onMouseDown(e:MouseEvent):void
{
this._previousX = e.localX;
this._previousY = e.localY;
this.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
protected function onMouseUp(e:MouseEvent):void
{
this.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
protected function onMouseDown(e:MouseEvent):void
{
this._drawing.graphics.lineStyle(3, 0x000000);
this._drawing.graphics.moveTo(this._previousX, this._previousY);
this._drawing.graphics.lineTo(e.localX, e.localY);
this._previousX = e.localX;
this._previousY = e.localY;
}
}
Это не проверено, но я думаю, вы поняли идею. Вам также следует ознакомиться с жизненными циклами компонентов и по-настоящему задуматься о том, какое поведение вы пытаетесь добиться, пытаясь абстрагировать его как данные (например, я не фанат функции addLabel: P).