Изменение размера макета после изменения размера загруженного изображения - PullRequest
0 голосов
/ 02 июня 2011

Итак, я загружаю действительно большое изображение в этом mx: Изображение manteinAspectRatio включено с ограничением по высоте и, как обычно, не работает (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>

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

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

UPDATE:

Чтение ответа 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 Ответ

0 голосов
/ 02 июня 2011

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

...