Странное поведение при динамическом изменении размера встроенного объекта Flash / Flex

У меня есть простое приложение Flex, которое представляет собой панель с повторителем внутри нее; хоть и немного упрощенно, но вот так:


<mx:Panel id="pnl">
    <mx:Repeater id="rp">
        <mx:Label text = "foo" />
    </mx:Repeater>
</mx:Panel>

Затем я встраиваю это приложение Flex в оболочку HTML. Затем я пытаюсь динамически изменять размер встроенного объекта Flash в HTML по мере изменения размера панели Flex (что позволяет приложению Flex использовать столько HTML-страницы, сколько ему нужно).

Я делаю это, выполняя следующие действия:


pnl.addEventListener(ResizeEvent.RESIZE,function(event:Event):void {
    ExternalInterface.call("resize",event.target.height);
});

which in turn calls this javascript function:


function resize(height) {
    // the embed or object that contains the flex app
    var e = document.getElementById('flex_object');
    if(e) e.height = height;
}

Кажется, это отлично работает в IE, однако я получаю странные результаты в Firefox / Safari, ретранслятор работает n раз, а затем текст, кажется, обрезается / исчезает в ретрансляторе, см. прикрепленное изображение: http://img528.imageshack.us/img528/9538/rpre0.jpg

Может ли кто-нибудь объяснить, почему это происходит, и есть ли обходные пути / способы сделать то же самое?


person mmattax    schedule 29.10.2008    source источник


Ответы (4)


В настоящее время я работаю над тем же (SWF, который динамически изменяет свою высоту в зависимости от содержимого, которое он в настоящее время содержит). У меня тоже была проблема, похожая на вашу, пытаясь сделать многострочную кнопку.

Я новичок в гибкости, но мне удалось решить проблему вручную, вызвав updateDisplayList () контейнера ... Я думаю, что он "заставляет" где-то рендерить ... его параметры - это ширина и высота некоторой области, где изменения случаться. Извините, что не знаю подробностей ... Но у меня это сработало.

person DanyAlejandro    schedule 30.08.2009

Почему бы просто не использовать процентную ширину и высоту на вашей HTML-странице для вашего Flash-объекта? Таким образом, вам не нужно ничего делать для изменения размера SWF ...

person netsuo    schedule 03.11.2008

Это очень странно - похоже, что Firefox / Safari расширяют область рисования встраивания, но каким-то образом Flash не получает сообщение о том, что ему необходимо отобразить новые пиксели.

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

Например, вместо изменения размера вставки вы можете попробовать поместить Flash в DIV, установить размер Flash на 100%, а затем изменить размер DIV. Это кажется гораздо менее вероятным плохим поведением.

person fenomas    schedule 05.11.2008

По моему опыту, возможности Flex по изменению размера ... забавны. Иногда они работают так, как можно было бы ожидать, иногда - нет. Есть несколько вещей, которые вы можете попробовать: во-первых, проследите значение, которое вы ожидаете получить в Flex для высоты или даже ExternalInterface.call ("alert", event.target.height); Так вы точно узнаете, проблема ли это в JavaScript или Flex (но я подозреваю, что это Flex).

Возможно, проблема связана с масштабированием компонента:

Установка свойства [высота] вызывает отправку события изменения размера. См. Событие изменения размера для получения подробной информации о том, когда это событие отправляется. Если свойство компонента scaleY не равно 100, высота компонента от его внутренних координат не будет совпадать. Таким образом, компонент высотой 100 пикселей с scaleY равным 200 займет 100 пикселей в родительском элементе, но внутренне будет думать, что он имеет высоту 50 пикселей.

Если это Flex, и это не помогает, я бы попытался использовать callLater перед вызовом ExternalInterface, часто это дает Flex достаточно времени, чтобы понять, что, черт возьми, он делает. Иногда требуется setTimeout, но мне это неудобно.

person cwallenpoole    schedule 20.01.2009