Имитация includeInLayout = false в чистом коде Actionscript - PullRequest
2 голосов
/ 19 февраля 2011

Если вы знаете Flex, вы, вероятно, знаете, что делает свойство "includeInLayout".Если нет, это свойство заставляет родительского элемента вашего компонента игнорировать границы (например, ширину и высоту) вашего компонента при отображении собственных границ.

Описание, приведенное ниже:

Указываетвключен ли этот компонент в макет родительского контейнера.Если true, объект включается в макет его родительского контейнера, а его размер и положение определяются его родительским контейнером в соответствии с его правилами макета.Если false, размер и положение объекта не зависят от макета его родительского контейнера.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/UIComponent.html#includeInLayout

В Flex, например:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="absolute"
                creationComplete="application1_creationCompleteHandler(event)">
    <mx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function application1_creationCompleteHandler( event:FlexEvent ):void
            {
                trace( container.width, container.height ); // output: 200 200
            }
        ]]>
    </mx:Script>
    <mx:Canvas id="container">
        <mx:Button label="Test"
                   width="100"
                   height="100" />
        <mx:Button label="Test2"
                   width="200"
                   height="200" />
    </mx:Canvas>
</mx:Application>

Теперь, если я установлю includeInLayout = "false" во второй кнопке:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="absolute"
                creationComplete="application1_creationCompleteHandler(event)">
    <mx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function application1_creationCompleteHandler( event:FlexEvent ):void
            {
                trace( container.width, container.height ); // output: 100 100
            }
        ]]>
    </mx:Script>
    <mx:Canvas id="container">
        <mx:Button label="Test"
                   width="100"
                   height="100" />
        <mx:Button label="Test2"
                   width="200"
                   height="200"
                   includeInLayout="false" />
    </mx:Canvas>
</mx:Application>

Я знаю всю архитектуру фреймворка, связанную с реализацией этого свойства, и знаю, что это свойство является свойством Flex Framework.То, что я хочу, это поведение в чистом ActionScript.Например:

import flash.display.Shape;

var myBox:Shape = new Shape();

myBox.graphics.beginFill(0xFF0000);
myBox.graphics.drawRect(0, 0, 100, 100);
myBox.graphics.endFill();

addChild(myBox);

trace(width, height); // output: 100 100

var myAnotherBox:Shape = new Shape();

myAnotherBox.graphics.beginFill(0xFF00FF, .5);
myAnotherBox.graphics.drawRect(0, 0, 200, 200);
myAnotherBox.graphics.endFill();

addChild(myAnotherBox);

trace(width, height); // output: 200 200

Существует ли какая-либо эквивалентная реализация в чистом ActionScript для воспроизведения этого поведения на "myAnotherBox"?

Я уже пробовал:

  • Изменить преобразованиематрица;
  • Изменить преобразование pixelBounds;
  • Изменить scrollRect;
  • Применить маски;

И безуспешно.

Приветствия...

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Вы пытаетесь сравнивать разные вещи. В первом примере ширина и высота взяты из класса UIComponent, который фактически представляет собой «измеренное» значение, как это предусмотрено в Flex Framework.

Во втором случае ширина и высота являются фактическим размером отображаемой фигуры, как это предусмотрено Flash Player.

Если вы откроете реализацию UIComponent, вы заметите, что он фактически скрывает первоначальное значение ширины и высоты в $ width и $ height и предоставит ему собственную реализацию.

Таким образом, чтобы ответить на ваш вопрос, вы не можете достичь того, что хотите, работая непосредственно с Shapes (чистые компоненты Flash) Каждый раз, когда вы рисуете что-то в графическом контексте, ширина и высота будут обновляться соответственно.

Ваши варианты:

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

  2. вычислите ширину и высоту самостоятельно. Это то, что на самом деле делают контейнеры, и просто пропустите дочерние компоненты includeInLayout = false.

0 голосов
/ 18 апреля 2011

Вам необходимо переопределить ширину и высоту в вашем контейнере:

override public function get width() : Number {
    // place your code here
    return 100;
}

override public function get height() : Number {
    // place your code here
    return 100;
}
0 голосов
/ 20 февраля 2011

Если вы посмотрите в исходном коде UIComponent, вы обнаружите, что флаг includeInLayout используется в механизме аннулирования (именно в аннулировании размера). Если includeInLayout компонента имеет значение false, то размер его родителя и его размер не пересчитываются. Invalidation - это собственный механизм Flex Framework, который не существует в чистых проектах AS.

...