Как использовать VGroup или HGroup в чистом actioncript3? - PullRequest
1 голос
/ 03 сентября 2011

Я разрабатываю флэш-приложение, используя бесплатный Flex SDK и текстовый редактор, и компилирую в командной строке.

Я хочу использовать VGroup или HGroup в своем ActionScript для управления позициями объектов DisplayObject.

Я написал следующий код:

import spark.components.*
import flash.text.*


var group:VGroup = new VGroup;

var text:TextField = new TextField
text.text = 'abc';

var sprite = new Sprite;
sprite.graphics.lineStyle(2, 0x000000);
sprite.graphics.drawRect(0, 0, 100, 100);

stage.addChild(group);
group.addElement(sprite); // runtime error
group.addElement(text); // compile error


Но добавление Sprite в VGroup вызывает ошибку во время выполнения:

TypeError: Error #1034: Type Coercion failed:
cannot convert flash.display::Sprite to mx.core.IVisualElement.


А добавление TextField в VGroup приводит к ошибке компиляции:

Error: Implicit coercion of a value of type flash.text:
TextField to an unrelated type mx.core:IVisualElement.


Как использовать VGroup или HGroup в чистом AS3?
В чем разница между DisplayObject и IVisualElement?


UPDATE:

Я попробовал 1-й способ ответа www.Flextras.com, SpriteVisualElement и StyleableTextField.
Я написал следующий код:

package {
    import flash.display.*
    import spark.core.SpriteVisualElement
    //import spark.components.supportClasses.StyleableTextField // compile error
    import spark.components.VGroup
    import flash.text.*

    [SWF(backgroundColor=0xffffff, width=500, height=500, frameRate=12)]

    public class VGroupTest extends Sprite {
        function VGroupTest() {
            //var text:StyleableTextField = new StyleableTextField
            //text.text = 'abc';

            var sprite1:SpriteVisualElement = new SpriteVisualElement;
            sprite1.graphics.lineStyle(2, 0x000000);
            sprite1.graphics.drawRect(0, 0, 100, 100);
            sprite1.width = 200
            sprite1.height = 200

            var sprite2:SpriteVisualElement = new SpriteVisualElement;
            sprite2.graphics.lineStyle(2, 0xff0000);
            sprite2.graphics.drawRect(0, 0, 200, 200);
            sprite2.width = 300
            sprite2.height = 300

            var group:VGroup = new VGroup;
            group.gap = 10
            group.width = 400
            group.height = 400
            this.stage.addChild(group);

            // the following codes show nothing
            //group.addElement(text);
            group.addElement(sprite1);
            group.addElement(sprite2);

            // the following codes show 2 rectangles
            //this.stage.addChild(sprite1)
            //this.stage.addChild(sprite2)
        }
    }
}


Но

import spark.components.supportClasses.StyleableTextField

вызвало следующую ошибку

40 Error: Definition spark.components.supportClasses:StyleableTextField could not be found


И SpriteVisualElement не отображается на экране.
Я что-то упустил?

1 Ответ

3 голосов
/ 03 сентября 2011

Вы используете правильный концептуальный подход.Однако элементы в группе (или VGroup или HGroup) должны реализовывать IVisualElement , который ни Sprite , ни TextField не реализуют.

У вас естьРассмотрим несколько вариантов:

  1. Использовать SpriteVisualElement вместо Sprite;или используйте StyleableTextField вместо TextField.
  2. Заверните Sprite или TextField как дочерний элемент UIComponent;затем используйте этот UIComponent в качестве элемента в группе.
  3. Используйте MX-контейнеры, такие как HBox или VBox.
  4. Используйте UIComponent вместо группы.Вам нужно будет написать свой собственный код макета в updateDisplayList (), чтобы это работало.

Я предпочитаю первый подход, а затем четвертый.Подход 2 добавляет много дополнительного кодирования, а подход 3 нежелателен из-за зависимости от архитектуры MX / Halo.

...