Я использовал класс mxml, но поскольку мне нужно передать некоторые свойства во время создания, для упрощения я конвертирую его в код as3.
Класс - RectangleShape, и он просто рисует прямоугольник.
Оригинальный mxml рабочий
<?xml version = "1.0" encoding = "utf-8"?>
<BaseShape name = "rectangle"
xmlns = "org.edorado.edoboard.view.components.shapes.*"
xmlns:mx = "http://www.adobe.com/2006/mxml"
xmlns:degrafa = "http://www.degrafa.com/2007"
xmlns:objecthandles = "com.roguedevelopment.objecthandles.*">
<mx:Script>
<![CDATA[
import org.edorado.edoboard.view.components.shapes.IShape;
import mx.events.FlexEvent;
override public function drag(movePt:Point):void {
this.width = movePt.x - this.x;
this.height = movePt.y - this.y;
}
override public function updateFillColor(color:int):void {
solidFill.color = color;
}
]]>
</mx:Script>
<degrafa:Surface >
<degrafa:GeometryGroup id = "geo">
<degrafa:fills>
<degrafa:SolidFill id = "solidFill" color = "white" alpha = "0.3"/>
</degrafa:fills>
<degrafa:strokes>
<degrafa:SolidStroke id = "stroke1" color = "white"/>
</degrafa:strokes>
<degrafa:RegularRectangle
id = "rect"
fill = "{solidFill}"
width = "{width}"
height = "{height}"
stroke = "{stroke1}" />
</degrafa:GeometryGroup>
</degrafa:Surface>
</BaseShape>
Моя попытка AS3
пакет org.edorado.edoboard.view.components.shapes { import com.degrafa.geometry.RegularRectangle; import com.degrafa.paint.SolidFill; import com.degrafa.paint.SolidStroke; import com.degrafa.GeometryGroup; import com.degrafa.Surface; import flash.geom.Point;
public class RectangleShape extends BaseShape
{
public var surface:Surface = new Surface();
public var geoGroup:GeometryGroup = new GeometryGroup();
public var solidFill:SolidFill = new SolidFill("white");
public var solidStroke:SolidStroke = new SolidStroke("black");
public var rect:RegularRectangle = new RegularRectangle();
public static const name:String = "rectangle";
public function RectangleShape() {
addChild(surface);
//surface.addChild(geoGroup);
surface.graphicsCollection.addItem(geoGroup);
solidFill.alpha = 0.3;
rect.fill = solidFill;
rect.stroke = solidStroke;
rect.width = this.width;
rect.height = this.height;
geoGroup.geometry = [rect];
geoGroup.draw(null, null);
}
override public function drag(movePt:Point):void {
this.width = movePt.x - this.x;
this.height = movePt.y - this.y;
trace('dragging ', this.width, this.height);
}
override public function updateFillColor(color:int):void {
solidFill.color = color;
}
}
}
Проблема в том, что фигура больше не рисуется, контейнер BaseShape есть, и я вижу, как работает перетаскивание трассировки, но больше не прямоугольник.
Что-нибудь очевидное, что я пропустил? Спасибо





Думаю, я определил проблему. Раньше в версии mxml у нас было
width = "{width}" height = "{height}"
И прямоугольник degrafa автоматически подойдет к своему родительскому элементу.
Но не в версии AS. я должен попытаться воспроизвести {width} и {height} в As. Любой инструмент для преобразования mxml в как?
Попробуйте настроить привязки с помощью класса BindingUtils.
Например:
BindingUtils.bindProperty(component, "height", this, "height");
Вы добавили ребенку свой RectangleShape?
Решение ! import mx.binding.utils.BindingUtils; BindingUtils.bindProperty (rect, «высота», this, «высота»); BindingUtils.bindProperty (прямоугольник, «ширина», «это», «ширина»);