Изменение размера макета после изменения размера загруженного изображения

#apache-flex #layout #actionscript

#apache-flex #макет #actionscript

Вопрос:

Итак, я загружаю действительно большой рисунок в этом mx: включена функция отображения с ограничением высоты, и, как обычно, это не работает (Flex определенно не для меня):

 <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
                   xmlns:s="library://ns.adobe.com/flex/spark"
                   xmlns:mx="library://ns.adobe.com/flex/mx">

        <s:Rect top="0" right="0" bottom="0" left="0">
            <s:fill>
                <mx:SolidColor color="#000000"/>
            </s:fill>
        </s:Rect>

        <s:VGroup id="a" top="0" right="0" bottom="0" left="0" horizontalAlign="center" verticalAlign="middle">

            <s:Group id="b">

                <s:Rect id="c" top="0" right="0" bottom="0" left="0" radiusX="10" radiusY="10">
                    <s:fill>
                        <mx:SolidColor color="#cccccc"/>
                    </s:fill>
                </s:Rect>

                <s:VGroup id="d" paddingTop="10" paddingRight="10" paddingBottom="10" paddingLeft="10">

                    <mx:Image id="e" source="big.jpg" maxHeight="300" maintainAspectRatio="true" />

                </s:VGroup>

            </s:Group>

        </s:VGroup>

    </s:Application>
  

The big.jpg имеет большую ширину, чем высоту, поэтому при изменении размера упаковочные контейнеры получают правильную новую высоту, но они по-прежнему имеют старую ширину.

Я пытался вызвать validateNow () для каждого элемента, аннулировать, callLater (), событие изменения размера, событие compete… Я новичок, который устал от AS 3.0

Обновить:

Читая ответ J_A_X, я закончил с этим:

 <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Script>
        <![CDATA[

        import flash.events.Event;
        import mx.controls.Image;

        private function fix(event:Event):void {

            var img:Image = event.target as Image;
            var h:uint = 300;

            img.width *= h / img.height;
            img.height = h;
            img.removeEventListener("updateComplete", fix);

        }

        ]]>
    </fx:Script>

    <s:Rect top="0" right="0" bottom="0" left="0">
        <s:fill>
            <mx:SolidColor color="#000000"/>
        </s:fill>
    </s:Rect>

    <s:VGroup top="0" right="0" bottom="0" left="0" horizontalAlign="center" verticalAlign="middle">

        <s:Group>

            <s:Rect top="0" right="0" bottom="0" left="0" radiusX="10" radiusY="10">
                <s:fill>
                    <mx:SolidColor color="#cccccc"/>
                </s:fill>
            </s:Rect>

            <s:VGroup paddingTop="10" paddingRight="10" paddingBottom="10" paddingLeft="10">

                <mx:Image source="big.jpg" maintainAspectRatio="false" updateComplete="fix(event)" />

            </s:VGroup>

        </s:Group>

    </s:VGroup>

</s:Application>
  

Я надеюсь, что это поможет другому, кто имеет дело с Flex.

Комментарии:

1. Я не пробовал ваш код, но, возможно, вам следует попробовать без такого количества контейнеров. Есть один из них, который изменяет размер вашего изображения.

2. Я не понимаю, что не работает. Что такое упаковочный контейнер? Почему вы ожидаете, что контейнер изменит размер сам по себе? В вашем коде нет ничего, что заставляло бы меня думать, что так и должно быть. Вы изменяете размер изображения или оставляете его как есть? Это ваш полный код?

Ответ №1:

После просмотра изображения кажется, что ему нужна явная высота / ширина, иначе оно не будет уменьшено должным образом. Немного глупо не масштабировать до максимальной высоты, но вы всегда можете использовать вместо этого класс изображений Flex 4.5 или просто создать свой собственный для обработки максимальной высоты / ширины.